Methods
Site Descriptions
A total of 41 sites were monitored at 7 parks
within the Northeast Coastal and Barrier Network, including Assateague
Island National Seashore (Maryland and Virginia), Cape Cod National
Seashore (Massachusetts), Colonial National Historical Park (Virginia),
Fire Island National Seashore (New York), Gateway National Recreation
Area (New Jersey and New York), George Washington Birthplace National
Monument (Virginia), and Sagamore Hill National Historic Site (New York)
(Figure 1). Salt marsh vegetation cover was monitored between 1997 to
2018 (Table 1).
Table 1. Site count, plot count, monitoring years, and count of sampling events at each park. |
|---|
Park Unit | Unit Code | Location | Number of Sites | Number of Plots | Sample Years | Sampling Events |
|---|
Assateague Island National Seashore | ASIS | MD, VA | 9 | 2,180 | 2008, 2010, 2012, 2014, 2016, 2018 | 6 |
Cape Cod National Seashore | CACO | MA | 10 | 2,293 | 1997, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2013 | 11 |
Colonial National Historical Park | COLO | VA | 8 | 1,043 | 2008, 2010, 2012, 2014, 2016 | 5 |
Fire Island National Seashore | FIIS | NY | 9 | 2,396 | 2009, 2011, 2013, 2015, 2017 | 5 |
Gateway National Recreation Area | GATE | NJ, NY | 3 | 414 | 2010, 2012, 2014, 2016, 2018 | 5 |
George Washington Birthplace National Monument | GEWA | VA | 1 | 140 | 2008, 2010, 2012 | 3 |
Sagamore Hill National Historic Site | SAHI | NY | 1 | 227 | 2009, 2011, 2013, 2015, 2017 | 5 |
Sampling Protocol
x, y, z.
Results
In total, we identified 280 unique plant
species within the salt marshes at all 7 parks. Mean plot species
richness varied from 1.7 at SAHI to 3.4 at CACO (mean: 2.5 ± 0.3; Table
2). Max plot species richness varied from 1.8972222 at GATE to 6.9219858
at CACO (mean: 3 ± 1; Table 2).
Total species richness varied from 18 at SAHI to 189 at CACO (mean:
68 ± 21; Table 2). The number of species that were unique to each park
varied from 2 at SAHI to 123 at CACO (mean: 27 ± 16; Table 2).
Mean plot species richness remained low
(between 1.2 to 3.6) throughout the study period at all parks except
CACO (Figure 1). At CACO, mean plot species richness fluctuated greatly
between the beginning of the study period in 1997 to 2005 (min: 2.0 in
2003; max: 6.9 in 2000) - most likely due to the fact that different
sites (and different numbers of sites) were sampled in each sampling
year, in contrast to the other parks where the same sites were sampled
every time. (Figure 1). Between 2005 to 2018 however, mean plot species
richness at CACO stabilized between 2.2 and 3.1, similar to the other 6
parks.
Table 2. Plant species richness within the salt marshes at each park. |
|---|
Park Unit | Mean Plot Richness | Max Plot Richness | Total Richness | Unique Species Count |
|---|
ASIS | 2.1 | 2.432972 | 42 | 5 |
CACO | 3.4 | 6.921986 | 189 | 123 |
COLO | 2.9 | 2.995000 | 63 | 19 |
FIIS | 2.6 | 2.782237 | 59 | 8 |
GATE | 1.7 | 1.897222 | 58 | 26 |
GEWA | 3.4 | 3.619048 | 44 | 4 |
SAHI | 1.7 | 2.200000 | 18 | 2 |
mean (± 1 SE) | 2.5 ± 0.3 | 3 ± 1 | 68 ± 21 | 27 ± 16 |

Rare, Threatened & Endangered Species
Only 1 rare species - Myrica gale at
GATE - was identified across all parks. Myrica gale was only
found in one plot in 2017 at GATE. No federally listed threatened or
endangered species were found at any of the parks.
Invasive, Noxious & Prohibited Species
Of the 280 unique species identified across
all parks, 10 were considered invasive, noxious, or prohibited within
their respective states (Table 3). No invasive species were found in
ASIS, GEWA, or SAHI. At CACO, 5 species, including
Celastrus
orbiculatus,
Lonicera japonica,
Lythrum
salicaria,
Phalaris arundinacea, and
Phragmites
australis were considered invasive by the Massachusetts Invasive
Plant Advisory Group (
https://massnrc.org/mipag/index.htm) (Table 3). At COLO,
only 1 species -
Najas minor - was considered invasive by the
Virginia Department of Conservation and Recreation (
https://www.dcr.virginia.gov/natural-heritage/invsppdflist)
(Table 3). At FIIS, 3 species, including
Elaeagnus umbellata,
Phragmites australis, and
Polygonum perfoliatum were
considered invasive by the state of New York (State of New York, 2022)
(Table 3). At GATE, 4 species, including
Artemisia vulgaris,
Lonicera japonica,
Phragmites australis,
Rubus
phoenicolasius, were considered invasive by the state of New York
(State of New York, 2022) (Table 3).
Relative cover of the majority of these
invasive species either remained stable over the course of the study
period or were only found once (Figure 3). Of the two invasive species
with increasing relative cover, Phragmites australis at CACO
increased from a low of 17.7% in 2000 to a high of 96.8% in 2005,
although this change may be related to differences in the number of
sites used in the earlier vs. later years at CACO. Similarly, the cover
of Artemisia vulgaris at GATE increased from a low of 7.5% in
2014 to a high of 91.3% in 2018 (Figure 3). Only 1 invasive species,
Phalaris arundinacea at CACO decreased substantially from a
high of 54.5% in 2008 to a low of 24.8% in 2013 (Figure 3).
Table 3. Invasive, noxious, or prohibited species found at each park. |
|---|
Park unit | Species |
|---|
CACO | Celastrus orbiculatus |
Lonicera japonica |
Lythrum salicaria |
Phalaris arundinacea |
Phragmites australis |
COLO | Najas minor |
FIIS | Elaeagnus umbellata |
Phragmites australis |
Polygonum perfoliatum |
GATE | Artemisia vulgaris |
Lonicera japonica |
Phragmites australis |
Rubus phoenicolasius |

Wetland Species
Of the 280 unique species identified across
all parks, 147 were considered hydrophytic in the northeast wetland
region (U.S. Army Corps of Engineers 2009) based on their
characterization as either obligate, facultative wetland, or faculative
on the National Wetland Plant List (Lichvar et al. 2016). Total wetland
species richness ranged from a low of 10 at SAHI to a high of 103 at
CACO (mean: 41 ± 11; Table 4).
Table 4. Total hydrophyte species richness at each park unit. |
|---|
Park unit | Total hydrophyte species richness |
|---|
ASIS | 25 |
CACO | 103 |
COLO | 49 |
FIIS | 37 |
GATE | 24 |
GEWA | 39 |
SAHI | 10 |
mean (+/- 1 SE) | 41 +/- 11 |
Table 5. Hydrophytic plant cover species with the top 5 highest relative mean cover at each park accross all years. |
|---|
Park unit | Species | Cover (%) |
|---|
ASIS | Spartina alterniflora | 53.5 |
Spartina patens | 9.1 |
Distichlis spicata | 8.6 |
Salicornia maritima | 3.0 |
Iva frutescens | 2.6 |
CACO | Phragmites australis | 19.3 |
Typha angustifolia | 11.5 |
Spartina alterniflora | 11.3 |
Thelypteris palustris | 3.7 |
Spartina patens | 2.9 |
COLO | Spartina cynosuroides | 16.1 |
Peltandra virginica | 15.4 |
Zizania aquatica | 4.0 |
Schoenoplectus pungens | 1.9 |
Pontederia cordata | 1.9 |
FIIS | Spartina alterniflora | 33.7 |
Spartina patens | 10.1 |
Distichlis spicata | 5.6 |
Phragmites australis | 2.3 |
Salicornia maritima | 1.8 |
GATE | Spartina alterniflora | 65.2 |
Spartina patens | 9.0 |
Iva frutescens | 3.8 |
Distichlis spicata | 3.3 |
Suaeda maritima | 1.6 |
GEWA | Spartina cynosuroides | 8.4 |
Spartina alterniflora | 7.2 |
Amaranthus cannabinus | 4.8 |
Kosteletzkya virginica | 2.2 |
Typha angustifolia | 2.2 |
SAHI | Spartina alterniflora | 74.6 |
Distichlis spicata | 7.7 |
Spartina patens | 7.7 |
Suaeda maritima | 2.4 |
Salicornia maritima | 1.6 |

wetland_species %>%
filter(UnitCode == "ASIS") %>%
group_by(UnitCode, Year_chr, SciName_cor) %>%
summarise(mean_rel_cover = mean(rel_percent_cover, na.rm =T)) %>%
pivot_wider(., id_cols = c("UnitCode", "Year_chr"), names_from = SciName_cor, values_from = c(mean_rel_cover), values_fill = 0) %>%
pivot_longer(., cols = -c("UnitCode", "Year_chr"), names_to = "SciName_cor", values_to = "mean_rel_cover") %>%
mutate(cover_category = factor(case_when(
mean_rel_cover == 0 ~ NA,
mean_rel_cover > 0 & mean_rel_cover < 2 ~ "b1%",
mean_rel_cover > 2 & mean_rel_cover <= 4 ~ "c2-4%",
mean_rel_cover > 4 & mean_rel_cover <= 9 ~ "d5-9%",
mean_rel_cover > 9 & mean_rel_cover <= 24 ~ "e10-24%",
mean_rel_cover > 25 & mean_rel_cover <= 49 ~ "f25-49%",
mean_rel_cover > 49 & mean_rel_cover <= 74 ~ "g50-74%",
mean_rel_cover > 74 ~ "h75-100%"
))) %>%
mutate(SciName_cor = factor(SciName_cor, levels=rev(sort(unique(SciName_cor))))) %>%
ggplot(., aes(x = Year_chr, y = SciName_cor, fill = cover_category)) +
geom_tile(color = "light grey", size = 0.25) +
scale_y_discrete(expand = c(0,0), name = "") +
scale_x_discrete(expand = c(0,0), name = "") +
scale_fill_brewer(type = "seq", palette = "YlGn", name = "Mean relative\ncover (%)") +
lfeheR::theme() +
theme_grey(base_size=8) +
theme(
panel.background = element_blank(),
panel.border = element_rect(color = "black", fill = "transparent"),
axis.ticks=element_line(linewidth=0.4)
)

Discussion
Species richness per plot at all parks (except CACO prior to 2005)
was similar to that of other salt marshes along the eastern Atlantic
coast of North America (citations here).
Literature Cited
Lichvar, R.W., D.L. Banks, W.N. Kirchner, and N.C. Melvin. 2016. The
National Wetland Plant List: 2016 wetland ratings. Phytoneuron 2016-30:
1-17. (See also the official website of the National Wetland Plant
List.)
State of New York. 2022. New
York Laws, Environmental Conservation § 9-170. New York Department
of State. 2021. 6
New York Codes, Rules and Regulations Part 575: Prohibited and Regulated
Invasive Species.
U.S. Army Corps of Engineers. 2009. Regional supplement to the Corps
of Engineers Wetland Delineation Manual: Northcentral and Northeast
Region. U.S. Army Corps of Engineers, Engineer Research and Development
Center, Environmental Laboratory ERDC/EL TR-09-19.
Appendix 1A. Salt marsh plant species list for Assateague Island National Seashore. |
|---|
Species | Common Name | USDA Symbol |
|---|
Andropogon virginicus | broomsedge bluestem | ANVI2 |
Aster | aster | ASTER |
Atriplex patula | spear saltbush | ATPA4 |
Baccharis halimifolia | eastern baccharis | BAHA |
Carex | sedge | CAREX |
Dichanthelium acuminatum var. fasciculatum | western panicgrass | DIACF |
Distichlis spicata | saltgrass | DISP |
Eleocharis | spikerush | ELEOC |
Elymus virginicus | Virginia wildrye | ELVI3 |
Eragrostis | lovegrass | ERAGR |
Festuca rubra | red fescue | FERU2 |
Ilex opaca | American holly | ILOP |
Iva frutescens | Jesuit's bark | IVFR |
Juncus effusus | common rush | JUEF |
Juncus gerardii | saltmeadow rush | JUGE |
Juncus roemerianus | needlegrass rush | JURO |
Limonium carolinianum | lavender thrift | LICA17 |
Lythrum lineare | wand lythrum | LYLI2 |
Mitchella repens | partridgeberry | MIRE |
Morella cerifera | wax myrtle | MOCE2 |
Morella pensylvanica | northern bayberry | MOPE6 |
Panicum virgatum | switchgrass | PAVI2 |
Parthenocissus quinquefolia | Virginia creeper | PAQU2 |
Phytolacca americana | American pokeweed | PHAM4 |
Pinus rigida | pitch pine | PIRI |
Pinus taeda | loblolly pine | PITA |
Ruppia maritima | widgeongrass | RUMA5 |
Salicornia | pickleweed | SALIC |
Salicornia bigelovii | dwarf saltwort | SABI |
Salicornia maritima | slender grasswort | SAMA11 |
Samolus valerandi ssp. parviflorus | seaside brookweed | SAVAP |
Schoenoplectus americanus | chairmaker's bulrush | SCAM6 |
Schoenoplectus pungens | common threesquare | SCPU10 |
Schoenoplectus pungens var. pungens | common threesquare | SCPUP5 |
Schoenoplectus robustus | sturdy bulrush | SCRO5 |
Smilax rotundifolia | roundleaf greenbrier | SMRO |
Solidago sempervirens | seaside goldenrod | SOSE |
Spartina alterniflora | smooth cordgrass | SPAL |
Spartina patens | saltmeadow cordgrass | SPPA |
Suaeda maritima | herbaceous seepweed | SUMA |
Toxicodendron radicans | eastern poison ivy | TORA2 |
Vitis rotundifolia | muscadine | VIRO3 |
Appendix 1B. Salt marsh plant species list for Cape Cod National Seashore. |
|---|
Species | Common Name | USDA Symbol |
|---|
Acer rubrum | red maple | ACRU |
Achillea millefolium | common yarrow | ACMI2 |
Agalinis maritima | saltmarsh false foxglove | AGMA3 |
Agrostis gigantea | redtop | AGGI2 |
Agrostis hyemalis | winter bentgrass | AGHY |
Agrostis perennans | upland bentgrass | AGPE |
Agrostis stolonifera | creeping bentgrass | AGST2 |
Amelanchier | serviceberry | AMELA |
Amelanchier canadensis | Canadian serviceberry | AMCA4 |
Ammophila breviligulata | American beachgrass | AMBR |
Arctostaphylos uva-ursi | kinnikinnick | ARUV |
Artemisia campestris | field sagewort | ARCA12 |
Artemisia stelleriana | oldwoman | ARST6 |
Atriplex | saltbush | ATRIP |
Atriplex prostrata | triangle orache | ATPR |
Baccharis halimifolia | eastern baccharis | BAHA |
Betula populifolia | gray birch | BEPO |
Bidens connata | purplestem beggarticks | BICO5 |
Boehmeria cylindrica | smallspike false nettle | BOCY |
Cakile edentula | American searocket | CAED |
Calamagrostis canadensis | bluejoint | CACA4 |
Calystegia sepium | hedge false bindweed | CASE13 |
Carex | sedge | CAREX |
Carex canescens | silvery sedge | CACA11 |
Carex comosa | longhair sedge | CACO8 |
Carex lurida | shallow sedge | CALU5 |
Carex normalis | greater straw sedge | CANO |
Carex scoparia | broom sedge | CASC11 |
Celastrus orbiculatus | Oriental bittersweet | CEOR7 |
Chenopodium album | lambsquarters | CHAL7 |
Cladonia | cup lichen | CLADO3 |
Cyperus filicinus | fern flatsedge | CYFI |
Daucus carota | Queen Anne's lace | DACA6 |
Decodon verticillatus | swamp loosestrife | DEVE |
Deschampsia flexuosa | wavy hairgrass | DEFL |
Dichanthelium | rosette grass | DICHA2 |
Dichanthelium acuminatum var. fasciculatum | western panicgrass | DIACF |
Distichlis spicata | saltgrass | DISP |
Drosera rotundifolia | roundleaf sundew | DRRO |
Elaeagnus angustifolia | Russian-olive | ELAN |
Eleocharis | spikerush | ELEOC |
Eleocharis tenuis | slender spikerush | ELTE |
Elymus repens | quackgrass | ELRE4 |
Elymus virginicus | Virginia wildrye | ELVI3 |
Epilobium leptophyllum | bog willowherb | EPLE2 |
Erechtites hieraciifolia | American burnweed | ERHI2 |
Erechtites hieraciifolia var. hieraciifolia | American burnweed | ERHIH |
Eupatoriadelphus dubius | coastal plain joe pye weed | EUDU2 |
Eupatoriadelphus maculatus var. bruneri | spotted joe pye weed | EUMAB |
Euthamia caroliniana | slender goldentop | EUCA26 |
Euthamia graminifolia | flat-top goldentop | EUGR5 |
Festuca rubra | red fescue | FERU2 |
Fragaria virginiana | Virginia strawberry | FRVI |
Galium | bedstraw | GALIU |
Galium trifidum | threepetal bedstraw | GATR2 |
Gaylussacia baccata | black huckleberry | GABA |
Glyceria canadensis | rattlesnake mannagrass | GLCA |
Hieracium | hawkweed | HIERA |
Hieracium aurantiacum | orange hawkweed | HIAU |
Holcus lanatus | common velvetgrass | HOLA |
Hudsonia ericoides | pine barren goldenheather | HUER |
Hudsonia tomentosa | woolly beachheather | HUTO |
Hypochaeris radicata | hairy cat's ear | HYRA3 |
Ilex verticillata | common winterberry | ILVE |
Impatiens capensis | jewelweed | IMCA |
Iva frutescens | Jesuit's bark | IVFR |
Juncus canadensis | Canadian rush | JUCA3 |
Juncus effusus | common rush | JUEF |
Juncus gerardii | saltmeadow rush | JUGE |
Juncus greenei | Greene's rush | JUGR |
Juncus tenuis | poverty rush | JUTE |
Lactuca canadensis | Canada lettuce | LACA |
Lathyrus japonicus | beach pea | LAJA |
Lechea intermedia | largepod pinweed | LEIN |
Lechea maritima | beach pinweed | LEMA |
Leersia oryzoides | rice cutgrass | LEOR |
Lemna | duckweed | LEMNA |
Lemna minor | common duckweed | LEMI3 |
Limonium carolinianum | lavender thrift | LICA17 |
Lonicera | honeysuckle | LONIC |
Lonicera japonica | Japanese honeysuckle | LOJA |
Lycopus | waterhorehound | LYCOP4 |
Lycopus americanus | American water horehound | LYAM |
Lycopus uniflorus | northern bugleweed | LYUN |
Lysimachia terrestris | earth loosestrife | LYTE2 |
Lythrum salicaria | purple loosestrife | LYSA2 |
Morella pensylvanica | northern bayberry | MOPE6 |
Nuttallanthus canadensis | Canada toadflax | NUCA |
Onoclea sensibilis | sensitive fern | ONSE |
Osmunda cinnamomea | cinnamon fern | OSCI |
Osmunda regalis | royal fern | OSRE |
Parthenocissus quinquefolia | Virginia creeper | PAQU2 |
Phalaris arundinacea | reed canarygrass | PHAR3 |
Photinia melanocarpa | black chokeberry | PHME13 |
Photinia pyrifolia | red chokeberry | PHPY4 |
Phragmites australis | common reed | PHAU7 |
Pinus rigida | pitch pine | PIRI |
Plantago | plantain | PLANT |
Plantago maritima | goose tongue | PLMA3 |
Plantago maritima var. juncoides | goose tongue | PLMAJ |
Platanthera clavellata | small green wood orchid | PLCL |
Pluchea odorata | sweetscent | PLOD |
Pluchea odorata var. odorata | sweetscent | PLODO |
Poa palustris | fowl bluegrass | POPA2 |
Polygonella articulata | coastal jointweed | POAR4 |
Polygonum | knotweed | POLYG4 |
Polygonum arifolium | halberdleaf tearthumb | POAR6 |
Polygonum hydropiper | marshpepper knotweed | POHY |
Polygonum sagittatum | arrowleaf tearthumb | POSA5 |
Populus grandidentata | bigtooth aspen | POGR4 |
Populus tremuloides | quaking aspen | POTR5 |
Potentilla simplex | common cinquefoil | POSI2 |
Prunus cerasifera | cherry plum | PRCE2 |
Prunus maritima | beach plum | PRMA2 |
Prunus serotina | black cherry | PRSE2 |
Pteridium aquilinum | western brackenfern | PTAQ |
Puccinellia distans | weeping alkaligrass | PUDI |
Puccinellia maritima | seaside alkaligrass | PUMA |
Quercus alba | white oak | QUAL |
Quercus ilicifolia | scrub oak | QUIL |
Quercus velutina | black oak | QUVE |
Rhus copallinum | winged sumac | RHCO |
Ribes hirtellum | hairystem gooseberry | RIHI |
Ribes lacustre | prickly currant | RILA |
Rosa | rose | ROSA5 |
Rosa carolina | Carolina rose | ROCA4 |
Rosa palustris | swamp rose | ROPA |
Rosa rugosa | rugosa rose | RORU |
Rosa virginiana | Virginia rose | ROVI2 |
Rubus | blackberry | RUBUS |
Rubus allegheniensis | Allegheny blackberry | RUAL |
Rubus flagellaris | northern dewberry | RUFL |
Rubus hispidus | bristly dewberry | RUHI |
Rubus idaeus | American red raspberry | RUID |
Rubus occidentalis | black raspberry | RUOC |
Rumex | dock | RUMEX |
Rumex acetosella | common sheep sorrel | RUAC3 |
Rumex orbiculatus | greater water dock | RUOR2 |
Salicornia | pickleweed | SALIC |
Salicornia bigelovii | dwarf saltwort | SABI |
Salicornia maritima | slender grasswort | SAMA11 |
Salix bebbiana | Bebb willow | SABE2 |
Sambucus nigra | black elderberry | SANI4 |
Sassafras albidum | sassafras | SAAL5 |
Schizachyrium scoparium | little bluestem | SCSC |
Schoenoplectus americanus | chairmaker's bulrush | SCAM6 |
Schoenoplectus pungens | common threesquare | SCPU10 |
Schoenoplectus pungens var. pungens | common threesquare | SCPUP5 |
Schoenoplectus robustus | sturdy bulrush | SCRO5 |
Scirpus cyperinus | woolgrass | SCCY |
Scutellaria | skullcap | SCUTE |
Scutellaria galericulata | marsh skullcap | SCGA |
Sisyrinchium atlanticum | eastern blue-eyed grass | SIAT |
Smilax rotundifolia | roundleaf greenbrier | SMRO |
Solanum dulcamara | climbing nightshade | SODU |
Solidago | goldenrod | SOLID |
Solidago canadensis | Canada goldenrod | SOCA6 |
Solidago flexicaulis | zigzag goldenrod | SOFL2 |
Solidago latissimifolia | Elliott's goldenrod | SOLA4 |
Solidago odora | anisescented goldenrod | SOOD |
Solidago rugosa | wrinkleleaf goldenrod | SORU2 |
Solidago sempervirens | seaside goldenrod | SOSE |
Sparganium americanum | American bur-reed | SPAM |
Spartina alterniflora | smooth cordgrass | SPAL |
Spartina patens | saltmeadow cordgrass | SPPA |
Spergularia salina | salt sandspurry | SPSA5 |
Sphagnum | sphagnum | SPHAG2 |
Spiraea | spirea | SPIRA |
Spiraea alba | white meadowsweet | SPAL2 |
Spiraea tomentosa | steeplebush | SPTO2 |
Suaeda | seepweed | SUAED |
Suaeda linearis | annual seepweed | SULI |
Suaeda maritima | herbaceous seepweed | SUMA |
Symphyotrichum novi-belgii | New York aster | SYNO3 |
Symphyotrichum subulatum | eastern annual saltmarsh aster | SYSU5 |
Symphyotrichum tenuifolium | perennial saltmarsh aster | SYTE6 |
Teucrium canadense | Canada germander | TECA3 |
Thelypteris palustris | eastern marsh fern | THPA |
Thinopyrum pycnanthum | tick quackgrass | THPY4 |
Toxicodendron radicans | eastern poison ivy | TORA2 |
Triadenum virginicum | Virginia marsh St. Johnswort | TRVI2 |
Typha angustifolia | narrowleaf cattail | TYAN |
Vaccinium angustifolium | lowbush blueberry | VAAN |
Vaccinium corymbosum | highbush blueberry | VACO |
Vaccinium macrocarpon | cranberry | VAMA |
Viburnum | viburnum | VIBUR |
Viburnum dentatum | southern arrowwood | VIDE |
Viburnum dentatum var. dentatum | southern arrowwood | VIDED4 |
Viola lanceolata | bog white violet | VILA4 |
Appendix 1C. Salt marsh plant species list for Colonial National Historical Park. |
|---|
Species | Common Name | USDA Symbol |
|---|
Acer rubrum | red maple | ACRU |
Amaranthus cannabinus | tidalmarsh amaranth | AMCA2 |
Apios americana | groundnut | APAM |
Baccharis halimifolia | eastern baccharis | BAHA |
Brasenia schreberi | watershield | BRSC |
Carex | sedge | CAREX |
Carex hyalinolepis | shoreline sedge | CAHY3 |
Carex lurida | shallow sedge | CALU5 |
Distichlis spicata | saltgrass | DISP |
Eleocharis parvula | dwarf spikerush | ELPA5 |
Hibiscus moscheutos | crimsoneyed rosemallow | HIMO |
Hydrocotyle | hydrocotyle | HYDRO2 |
Hydrocotyle verticillata | whorled marshpennywort | HYVE2 |
Iva frutescens | Jesuit's bark | IVFR |
Juncus | rush | JUNCU |
Juncus effusus | common rush | JUEF |
Juncus gerardii | saltmeadow rush | JUGE |
Juncus roemerianus | needlegrass rush | JURO |
Juncus tenuis | poverty rush | JUTE |
Juniperus virginiana | eastern redcedar | JUVI |
Leersia | cutgrass | LEERS |
Leersia oryzoides | rice cutgrass | LEOR |
Lilaeopsis chinensis | eastern grasswort | LICH |
Lonicera | honeysuckle | LONIC |
Lycopus | waterhorehound | LYCOP4 |
Lythrum lineare | wand lythrum | LYLI2 |
Mikania scandens | climbing hempvine | MISC |
Morella cerifera | wax myrtle | MOCE2 |
Najas minor | brittle waternymph | NAMI |
Osmunda regalis | royal fern | OSRE |
Peltandra virginica | green arrow arum | PEVI |
Persea borbonia | redbay | PEBO |
Phragmites australis | common reed | PHAU7 |
Phyla lanceolata | lanceleaf fogfruit | PHLA3 |
Pinus rigida | pitch pine | PIRI |
Pluchea odorata | sweetscent | PLOD |
Polygonum | knotweed | POLYG4 |
Polygonum persicaria | spotted ladysthumb | POPE3 |
Polygonum punctatum | dotted smartweed | POPU5 |
Pontederia cordata | pickerelweed | POCO14 |
Ptilimnium capillaceum | herbwilliam | PTCA |
Rumex verticillatus | swamp dock | RUVE3 |
Sagittaria lancifolia | bulltongue arrowhead | SALA |
Sagittaria subulata | awl-leaf arrowhead | SASU |
Samolus valerandi | seaside brookweed | SAVA3 |
Samolus valerandi ssp. parviflorus | seaside brookweed | SAVAP |
Schoenoplectus americanus | chairmaker's bulrush | SCAM6 |
Schoenoplectus pungens | common threesquare | SCPU10 |
Schoenoplectus pungens var. pungens | common threesquare | SCPUP5 |
Schoenoplectus robustus | sturdy bulrush | SCRO5 |
Schoenoplectus tabernaemontani | softstem bulrush | SCTA2 |
Spartina alterniflora | smooth cordgrass | SPAL |
Spartina cynosuroides | big cordgrass | SPCY |
Spartina patens | saltmeadow cordgrass | SPPA |
Taxodium distichum | baldcypress | TADI2 |
Teucrium canadense | Canada germander | TECA3 |
Thelypteris palustris | eastern marsh fern | THPA |
Toxicodendron radicans | eastern poison ivy | TORA2 |
Typha | cattail | TYPHA |
Typha angustifolia | narrowleaf cattail | TYAN |
Vitis | grape | VITIS |
Zizania aquatica | annual wildrice | ZIAQ |
Zizaniopsis miliacea | giant cutgrass | ZIMI |
Appendix 1D. Salt marsh plant species list for Fire Island National Seashore. |
|---|
Species | Common Name | USDA Symbol |
|---|
Ammophila breviligulata | American beachgrass | AMBR |
Atriplex patula | spear saltbush | ATPA4 |
Baccharis halimifolia | eastern baccharis | BAHA |
Bassia hirsuta | hairy smotherweed | BAHI3 |
Bassia hyssopifolia | fivehorn smotherweed | BAHY |
Cakile edentula | American searocket | CAED |
Calystegia sepium | hedge false bindweed | CASE13 |
Cuscuta | dodder | CUSCU |
Distichlis spicata | saltgrass | DISP |
Elaeagnus umbellata | autumn olive | ELUM |
Eleocharis | spikerush | ELEOC |
Elymus virginicus | Virginia wildrye | ELVI3 |
Hibiscus | rosemallow | HIBIS2 |
Hibiscus moscheutos | crimsoneyed rosemallow | HIMO |
Iva frutescens | Jesuit's bark | IVFR |
Juncus | rush | JUNCU |
Juncus canadensis | Canadian rush | JUCA3 |
Juncus effusus | common rush | JUEF |
Juncus gerardii | saltmeadow rush | JUGE |
Juncus roemerianus | needlegrass rush | JURO |
Kosteletzkya virginica | Virginia saltmarsh mallow | KOVI |
Lepidium | pepperweed | LEPID |
Limonium carolinianum | lavender thrift | LICA17 |
Lonicera | honeysuckle | LONIC |
Mikania scandens | climbing hempvine | MISC |
Morella pensylvanica | northern bayberry | MOPE6 |
Panicum | panicgrass | PANIC |
Parthenocissus quinquefolia | Virginia creeper | PAQU2 |
Phragmites australis | common reed | PHAU7 |
Pluchea odorata | sweetscent | PLOD |
Polygonum perfoliatum | Asiatic tearthumb | POPE10 |
Polygonum punctatum | dotted smartweed | POPU5 |
Quercus velutina | black oak | QUVE |
Rosa | rose | ROSA5 |
Rubus | blackberry | RUBUS |
Ruppia maritima | widgeongrass | RUMA5 |
Salicornia | pickleweed | SALIC |
Salicornia bigelovii | dwarf saltwort | SABI |
Salicornia maritima | slender grasswort | SAMA11 |
Schoenoplectus americanus | chairmaker's bulrush | SCAM6 |
Schoenoplectus pungens | common threesquare | SCPU10 |
Schoenoplectus pungens var. pungens | common threesquare | SCPUP5 |
Schoenoplectus robustus | sturdy bulrush | SCRO5 |
Scirpus | bulrush | SCIRP |
Setaria parviflora | marsh bristlegrass | SEPA10 |
Smilax rotundifolia | roundleaf greenbrier | SMRO |
Solidago rugosa | wrinkleleaf goldenrod | SORU2 |
Solidago sempervirens | seaside goldenrod | SOSE |
Spartina alterniflora | smooth cordgrass | SPAL |
Spartina patens | saltmeadow cordgrass | SPPA |
Suaeda | seepweed | SUAED |
Suaeda maritima | herbaceous seepweed | SUMA |
Symphyotrichum tenuifolium | perennial saltmarsh aster | SYTE6 |
Teucrium canadense | Canada germander | TECA3 |
Thelypteris palustris | eastern marsh fern | THPA |
Toxicodendron radicans | eastern poison ivy | TORA2 |
Triadenum virginicum | Virginia marsh St. Johnswort | TRVI2 |
Typha angustifolia | narrowleaf cattail | TYAN |
Vitis rotundifolia | muscadine | VIRO3 |
Appendix 1E. Salt marsh plant species list for Gateway National Recreation Area. |
|---|
Species | Common Name | USDA Symbol |
|---|
Acalypha rhomboidea | common threeseed mercury | ACRH |
Ageratina altissima | white snakeroot | AGAL5 |
Amelanchier canadensis | Canadian serviceberry | AMCA4 |
Ammophila breviligulata | American beachgrass | AMBR |
Artemisia vulgaris | common wormwood | ARVU |
Atriplex cristata | crested saltbush | ATCR2 |
Atriplex patula | spear saltbush | ATPA4 |
Baccharis halimifolia | eastern baccharis | BAHA |
Bassia | smotherweed | BASSI |
Bassia hyssopifolia | fivehorn smotherweed | BAHY |
Bidens bipinnata | Spanish needles | BIBI7 |
Bromus | brome | BROMU |
Cakile edentula | American searocket | CAED |
Calystegia sepium | hedge false bindweed | CASE13 |
Carex kobomugi | Japanese sedge | CAKO2 |
Celtis occidentalis | hackberry | CEOC |
Cenchrus longispinus | mat sandbur | CELO3 |
Cenchrus tribuloides | sanddune sandbur | CETR |
Centaurea melitensis | Maltese star-thistle | CEME2 |
Chamaesyce polygonifolia | seaside sandmat | CHPO6 |
Digitaria | crabgrass | DIGIT2 |
Distichlis spicata | saltgrass | DISP |
Ilex opaca | American holly | ILOP |
Ipomoea | morning-glory | IPOMO |
Iva frutescens | Jesuit's bark | IVFR |
Juniperus virginiana | eastern redcedar | JUVI |
Lepidium virginicum | Virginia pepperweed | LEVI3 |
Limonium carolinianum | lavender thrift | LICA17 |
Lonicera japonica | Japanese honeysuckle | LOJA |
Melilotus | sweetclover | MELIL |
Mirabilis nyctaginea | heartleaf four o'clock | MINY |
Myrica gale | sweetgale | MYGA |
Opuntia humifusa | devil's-tongue | OPHU |
Parthenocissus quinquefolia | Virginia creeper | PAQU2 |
Phragmites australis | common reed | PHAU7 |
Phytolacca americana | American pokeweed | PHAM4 |
Pseudognaphalium obtusifolium | rabbit-tobacco | PSOB3 |
Rhus copallinum var. latifolia | winged sumac | RHCOL2 |
Rosa rugosa | rugosa rose | RORU |
Rubus pensilvanicus | Pennsylvania blackberry | RUPE3 |
Rubus phoenicolasius | wine raspberry | RUPH |
Ruppia maritima | widgeongrass | RUMA5 |
Salicornia | pickleweed | SALIC |
Salicornia bigelovii | dwarf saltwort | SABI |
Salicornia maritima | slender grasswort | SAMA11 |
Salsola kali | Russian thistle | SAKA |
Setaria parviflora | marsh bristlegrass | SEPA10 |
Smilax rotundifolia | roundleaf greenbrier | SMRO |
Solanum nigrum | black nightshade | SONI |
Solidago | goldenrod | SOLID |
Solidago sempervirens | seaside goldenrod | SOSE |
Spartina alterniflora | smooth cordgrass | SPAL |
Spartina patens | saltmeadow cordgrass | SPPA |
Suaeda | seepweed | SUAED |
Suaeda linearis | annual seepweed | SULI |
Suaeda maritima | herbaceous seepweed | SUMA |
Toxicodendron radicans | eastern poison ivy | TORA2 |
Xanthium strumarium | rough cocklebur | XAST |
Appendix 1F. Salt marsh plant species list for George Washington Birthplace National Monument. |
|---|
Species | Common Name | USDA Symbol |
|---|
Acer rubrum | red maple | ACRU |
Alnus serrulata | hazel alder | ALSE2 |
Amaranthus cannabinus | tidalmarsh amaranth | AMCA2 |
Atriplex patula | spear saltbush | ATPA4 |
Baccharis halimifolia | eastern baccharis | BAHA |
Boehmeria cylindrica | smallspike false nettle | BOCY |
Brasenia schreberi | watershield | BRSC |
Cyperus | flatsedge | CYPER |
Decodon verticillatus | swamp loosestrife | DEVE |
Distichlis spicata | saltgrass | DISP |
Elymus virginicus | Virginia wildrye | ELVI3 |
Galium | bedstraw | GALIU |
Hibiscus moscheutos | crimsoneyed rosemallow | HIMO |
Hydrocotyle verticillata | whorled marshpennywort | HYVE2 |
Ilex opaca | American holly | ILOP |
Impatiens capensis | jewelweed | IMCA |
Iva frutescens | Jesuit's bark | IVFR |
Juncus effusus | common rush | JUEF |
Kosteletzkya virginica | Virginia saltmarsh mallow | KOVI |
Leersia oryzoides | rice cutgrass | LEOR |
Lythrum lineare | wand lythrum | LYLI2 |
Mikania scandens | climbing hempvine | MISC |
Morella cerifera | wax myrtle | MOCE2 |
Onoclea sensibilis | sensitive fern | ONSE |
Panicum virgatum | switchgrass | PAVI2 |
Peltandra virginica | green arrow arum | PEVI |
Phalaris arundinacea | reed canarygrass | PHAR3 |
Phragmites australis | common reed | PHAU7 |
Polygonum arifolium | halberdleaf tearthumb | POAR6 |
Polygonum punctatum | dotted smartweed | POPU5 |
Polygonum sagittatum | arrowleaf tearthumb | POSA5 |
Ptilimnium capillaceum | herbwilliam | PTCA |
Quercus phellos | willow oak | QUPH |
Rumex | dock | RUMEX |
Rumex verticillatus | swamp dock | RUVE3 |
Saururus cernuus | lizard's tail | SACE |
Schoenoplectus americanus | chairmaker's bulrush | SCAM6 |
Schoenoplectus robustus | sturdy bulrush | SCRO5 |
Smilax rotundifolia | roundleaf greenbrier | SMRO |
Spartina alterniflora | smooth cordgrass | SPAL |
Spartina cynosuroides | big cordgrass | SPCY |
Spartina patens | saltmeadow cordgrass | SPPA |
Typha angustifolia | narrowleaf cattail | TYAN |
Zizania aquatica | annual wildrice | ZIAQ |
Appendix 1G. Salt marsh plant species list for Sagamore Hill National Historic Site. |
|---|
Species | Common Name | USDA Symbol |
|---|
Ammophila breviligulata | American beachgrass | AMBR |
Atriplex cristata | crested saltbush | ATCR2 |
Atriplex patula | spear saltbush | ATPA4 |
Bassia hyssopifolia | fivehorn smotherweed | BAHY |
Distichlis spicata | saltgrass | DISP |
Iva frutescens | Jesuit's bark | IVFR |
Lechea maritima | beach pinweed | LEMA |
Limonium carolinianum | lavender thrift | LICA17 |
Panicum amarum | bitter panicgrass | PAAM2 |
Ruppia maritima | widgeongrass | RUMA5 |
Salicornia | pickleweed | SALIC |
Salicornia maritima | slender grasswort | SAMA11 |
Solidago sempervirens | seaside goldenrod | SOSE |
Spartina alterniflora | smooth cordgrass | SPAL |
Spartina patens | saltmeadow cordgrass | SPPA |
Suaeda | seepweed | SUAED |
Suaeda calceoliformis | Pursh seepweed | SUCA2 |
Suaeda maritima | herbaceous seepweed | SUMA |
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCm1haW5mb250OiBUaW1lcyBOZXcgUm9tYW4NCi0tLQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkodGF4aXplKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGd0KQ0KbGlicmFyeShmbGV4dGFibGUpDQpsaWJyYXJ5KG9mZmljZXIpDQpsaWJyYXJ5KGV4dHJhZm9udCkNCm9wdGlvbnMoZHBseXIuc3VtbWFyaXNlLmluZm9ybSA9IEZBTFNFKQ0KI2ZvbnRfaW1wb3J0KHBhdHRlcm4gPSAidGltZXMiKQ0KbG9hZGZvbnRzKGRldmljZSA9ICJ3aW4iKQ0KDQpsb2FkKGhlcmU6OmhlcmUoImRhdGEiLCAiZGVyaXZlZCIsICJ2ZWdfY2xlYW5lZC5yZGEiKSkNCmBgYA0KDQojIyMjIyAqKk1ldGhvZHMqKg0KIyMjIyMgKlNpdGUgRGVzY3JpcHRpb25zKg0KfCAgIEEgdG90YWwgb2YgYHIgcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUgdW5ncm91cCgpICU+JSBzdW1tYXJpc2Uobl9kaXN0aW5jdChVbmlxdWVJRCkpICU+JSBwbHVjaygxKWAgc2l0ZXMgd2VyZSBtb25pdG9yZWQgYXQgNyBwYXJrcyB3aXRoaW4gdGhlIE5vcnRoZWFzdCBDb2FzdGFsIGFuZCBCYXJyaWVyIE5ldHdvcmssIGluY2x1ZGluZyBBc3NhdGVhZ3VlIElzbGFuZCBOYXRpb25hbCBTZWFzaG9yZSAoTWFyeWxhbmQgYW5kIFZpcmdpbmlhKSwgQ2FwZSBDb2QgTmF0aW9uYWwgU2Vhc2hvcmUgKE1hc3NhY2h1c2V0dHMpLCBDb2xvbmlhbCBOYXRpb25hbCBIaXN0b3JpY2FsIFBhcmsgKFZpcmdpbmlhKSwgRmlyZSBJc2xhbmQgTmF0aW9uYWwgU2Vhc2hvcmUgKE5ldyBZb3JrKSwgR2F0ZXdheSBOYXRpb25hbCBSZWNyZWF0aW9uIEFyZWEgKE5ldyBKZXJzZXkgYW5kIE5ldyBZb3JrKSwgR2VvcmdlIFdhc2hpbmd0b24gQmlydGhwbGFjZSBOYXRpb25hbCBNb251bWVudCAoVmlyZ2luaWEpLCBhbmQgU2FnYW1vcmUgSGlsbCBOYXRpb25hbCBIaXN0b3JpYyBTaXRlIChOZXcgWW9yaykgKEZpZ3VyZSAxKS4gU2FsdCBtYXJzaCB2ZWdldGF0aW9uIGNvdmVyIHdhcyBtb25pdG9yZWQgYmV0d2VlbiBgciBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JSB1bmdyb3VwKCkgJT4lIHN1bW1hcmlzZShtaW4oYXMubnVtZXJpYyhZZWFyX2NocikpKSAlPiUgcGx1Y2soMSlgIHRvIGByIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lIHVuZ3JvdXAoKSAlPiUgc3VtbWFyaXNlKG1heChhcy5udW1lcmljKFllYXJfY2hyKSkpICU+JSBwbHVjaygxKWAgKFRhYmxlIDEpLg0KJm5ic3A7DQoNCiFbRmlndXJlLjFdKHZlZ19uZWt0b25fc2l0ZV9tYXAuanBnKQ0KJm5ic3A7DQoNCmBgYHtyIHNldCBmbGV4dGFibGUgZGVmYXVsdHMsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0Kc2V0X2ZsZXh0YWJsZV9kZWZhdWx0cygNCiAgZm9udC5zaXplID0gMTIsDQogIGZvbnQuZmFtaWx5ID0gInRpbWVzIG5ldyByb21hbiIsDQogIHBhZGRpbmcgPSAxDQogICkNCmBgYA0KDQpgYGB7ciBUYWJsZSAxLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUpICU+JQ0KICBzdW1tYXJpc2Uoc2l0ZV9jb3VudCA9IG5fZGlzdGluY3QoVW5pcXVlSUQpLA0KICAgICAgICAgICAgcGxvdF9jb3VudCA9IG5fZGlzdGluY3QoRXZlbnRJRCksDQogICAgICAgICAgICBtaW5feWVhciA9IG1pbihhcy5udW1lcmljKFllYXJfY2hyKSksDQogICAgICAgICAgICBtYXhfeWVhciA9IG1heChhcy5udW1lcmljKFllYXJfY2hyKSksDQogICAgICAgICAgICBzYW1wbGVfZXZlbnRzID0gbl9kaXN0aW5jdChZZWFyX2NociksDQogICAgICAgICAgICB5ZWFyc19zYW1wbGVkID0gdG9TdHJpbmcodW5pcXVlKHNvcnQoWWVhcl9jaHIpKSkpICU+JSANCiAgbXV0YXRlKGZ1bGxfcGFya19uYW1lID0gY2FzZV93aGVuKA0KICAgIFVuaXRDb2RlID09ICJBU0lTIiB+ICJBc3NhdGVhZ3VlIElzbGFuZCBOYXRpb25hbCBTZWFzaG9yZSIsDQogICAgVW5pdENvZGUgPT0gIkNBQ08iIH4gIkNhcGUgQ29kIE5hdGlvbmFsIFNlYXNob3JlIiwNCiAgICBVbml0Q29kZSA9PSAiQ09MTyIgfiAiQ29sb25pYWwgTmF0aW9uYWwgSGlzdG9yaWNhbCBQYXJrIiwNCiAgICBVbml0Q29kZSA9PSAiRklJUyIgfiAiRmlyZSBJc2xhbmQgTmF0aW9uYWwgU2Vhc2hvcmUiLA0KICAgIFVuaXRDb2RlID09ICJHQVRFIiB+ICJHYXRld2F5IE5hdGlvbmFsIFJlY3JlYXRpb24gQXJlYSIsDQogICAgVW5pdENvZGUgPT0gIkdFV0EiIH4gIkdlb3JnZSBXYXNoaW5ndG9uIEJpcnRocGxhY2UgTmF0aW9uYWwgTW9udW1lbnQiLA0KICAgIFVuaXRDb2RlID09ICJTQUhJIiB+ICJTYWdhbW9yZSBIaWxsIE5hdGlvbmFsIEhpc3RvcmljIFNpdGUiDQogICksDQogICAgU3RhdGUgPSBjYXNlX3doZW4oDQogICAgVW5pdENvZGUgPT0gIkFTSVMiIH4gIk1ELCBWQSIsDQogICAgVW5pdENvZGUgPT0gIkNBQ08iIH4gIk1BIiwNCiAgICBVbml0Q29kZSA9PSAiQ09MTyIgfiAiVkEiLA0KICAgIFVuaXRDb2RlID09ICJGSUlTIiB+ICJOWSIsDQogICAgVW5pdENvZGUgPT0gIkdBVEUiIH4gIk5KLCBOWSIsDQogICAgVW5pdENvZGUgPT0gIkdFV0EiIH4gIlZBIiwNCiAgICBVbml0Q29kZSA9PSAiU0FISSIgfiAiTlkiDQogICAgICAgICkpICU+JQ0KZmxleHRhYmxlKC4sIGNvbF9rZXlzID0gYygiZnVsbF9wYXJrX25hbWUiLCAiVW5pdENvZGUiLCAiU3RhdGUiLCAic2l0ZV9jb3VudCIsICJwbG90X2NvdW50IiwgInllYXJzX3NhbXBsZWQiLCAic2FtcGxlX2V2ZW50cyIpKSAlPiUNCiAgYWxpZ24oLiwgYWxpZ24gPSAiY2VudGVyIiwgcGFydCA9ICJhbGwiKSAlPiUNCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMoLiwgd2lkdGggPSAxLCBsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JQ0KICBhZGRfaGVhZGVyX2xpbmVzKC4sIHZhbHVlcyA9IGMoIlRhYmxlIDEuIFNpdGUgY291bnQsIHBsb3QgY291bnQsIG1vbml0b3JpbmcgeWVhcnMsIGFuZCBjb3VudCBvZiBzYW1wbGluZyBldmVudHMgYXQgZWFjaCBwYXJrLiIpKSAlPiUNCiAgc2V0X2hlYWRlcl9sYWJlbHMoLiwgZnVsbF9wYXJrX25hbWUgPSAiUGFyayBVbml0IiwgVW5pdENvZGUgPSAiVW5pdCBDb2RlIiwgU3RhdGUgPSAiTG9jYXRpb24iLCBzaXRlX2NvdW50ID0gIk51bWJlciBvZiBTaXRlcyIsIHBsb3RfY291bnQgPSAiTnVtYmVyIG9mIFBsb3RzIiwgeWVhcnNfc2FtcGxlZCA9ICJTYW1wbGUgWWVhcnMiLCBzYW1wbGVfZXZlbnRzID0gIlNhbXBsaW5nIEV2ZW50cyIpICU+JQ0KICBhbGlnbiguLCBpID0gMSwgYWxpZ24gPSAibGVmdCIsIHBhcnQgPSAiaGVhZGVyIikgJT4lDQogIGJvcmRlcl9pbm5lcl9oKC4sIGJvcmRlciA9IGZwX2JvcmRlcihjb2xvciA9ICJ0cmFuc3BhcmVudCIpLCBwYXJ0ID0gImJvZHkiKSAlPiUNCiAgY29sZm9ybWF0X2RvdWJsZSguLCBqID0gYyg2OjcpLCBiaWcubWFyayA9ICIiLCBkaWdpdHMgPSAwKSAlPiUNCiAgcGFkZGluZyguLCBwYXJ0ID0gImJvZHkiLCBwYWRkaW5nLnRvcCA9IDMsIHBhZGRpbmcuYm90dG9tID0gMykgDQogIA0KYGBgDQojIyMjIyAqU2FtcGxpbmcgUHJvdG9jb2wqDQp8ICAgeCwgeSwgei4NCiZuYnNwOw0KDQojIyMjIyAqKlJlc3VsdHMqKg0KYGBge3IgU3BlY2llcyBjb3VudCwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQojIFNwZWNpZXMgcmljaG5lc3MgLSB0b3RhbCBhbGwgcGFya3MNCnRvdGFsX3NwZWNpZXMgPC0gcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3QoU2NpTmFtZV9jb3IpICU+JQ0KICBzdW1tYXJpc2Uobl9kaXN0aW5jdChTY2lOYW1lX2NvcikpICU+JQ0KICBwdWxsKCkgJT4lDQogIGFzLm51bWVyaWMoKQ0KDQpwYXJrX3NwZWNpZXNfcmljaG5lc3MgPC0gcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUpICU+JQ0KICBzdW1tYXJpc2UodG90YWxfY291bnQgPSBuX2Rpc3RpbmN0KFNjaU5hbWVfY29yKSwNCiAgICAgICAgICAgIHBsb3RfbnVtID0gbl9kaXN0aW5jdChFdmVudElEKSwNCiAgICAgICAgICAgIHNpdGVfbnVtID0gbl9kaXN0aW5jdChVbmlxdWVJRCksDQogICAgICAgICAgICBjb3VudF9wZXJfcGxvdCA9IHRvdGFsX2NvdW50L3Bsb3RfbnVtLA0KICAgICAgICAgICAgY291bnRfcGVyX3NpdGUgPSB0b3RhbF9jb3VudC9zaXRlX251bSkNCg0KcGFya19zcGVjaWVzIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KFVuaXRDb2RlLCBTY2lOYW1lX2NvcikgJT4lDQogIHVuaXF1ZSgpDQoNCiMgU3BlY2llcyByaWNobmVzcyBwZXIgcGxvdA0KcGxvdF9udW1zX3Blcl95ZWFyIDwtIHZlZyAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUsIFllYXIpICU+JQ0KICBzdW1tYXJpc2UocGxvdF9udW0gPSBuX2Rpc3RpbmN0KEV2ZW50SUQpKQ0KDQpwbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogIGdyb3VwX2J5KEV2ZW50SUQsIFVuaXF1ZUlELCBVbml0Q29kZSwgWWVhcl9jaHIpICU+JQ0KICBzdW1tYXJpc2Uoc3BlY2llc19jb3VudCA9IG5fZGlzdGluY3QoU2NpTmFtZV9jb3IpKSAlPiUNCiAgZ3JvdXBfYnkoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NocikgJT4lDQogIG11dGF0ZSh0b3RhbF9wbG90cyA9IG5fZGlzdGluY3QoRXZlbnRJRCkpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3MgPSBzdW0oc3BlY2llc19jb3VudCkvbWVhbih0b3RhbF9wbG90cykpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyID0gbWVhbihtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzcykpICU+JQ0KICBtdXRhdGUoWWVhciA9IGFzLm51bWVyaWMoWWVhcl9jaHIpKQ0KDQpjb3VudF91bmlxdWVfZnVuIDwtIGZ1bmN0aW9uKHBhcmspIHsNCiAgc2V0ZGlmZihwYXJrX3NwZWNpZXMgJT4lIA0KICAgICAgICAgICAgZmlsdGVyKFVuaXRDb2RlID09IHBhcmspICU+JQ0KICAgICAgICAgICAgc2VsZWN0KC1Vbml0Q29kZSksDQogICAgICAgICAgcGFya19zcGVjaWVzICU+JQ0KICAgICAgICAgICAgZmlsdGVyKFVuaXRDb2RlICE9IHBhcmspICU+JQ0KICAgICAgICAgICAgc2VsZWN0KC1Vbml0Q29kZSkpICU+JQ0KICAgIGNvdW50KCkgJT4lDQogICAgcHVsbCgpDQp9DQoNCmNvdW50X3VuaXF1ZSA8LSBwYXJrX3NwZWNpZXNfcmljaG5lc3MgJT4lDQogIHNlbGVjdCgtdG90YWxfY291bnQpICU+JQ0KICBtdXRhdGUoY291bnRfdW5pcXVlID0gbWFwX2RibChVbml0Q29kZSwgfmNvdW50X3VuaXF1ZV9mdW4oLngpKSkNCg0KcGxvdF9zcGVjaWVzX3JpY2huZXNzIDwtIHBsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzID0gbWVhbihtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIpLA0KICAgICAgICAgICAgbWF4X3Bsb3Rfc3BlY2llc19yaWNobmVzcyA9IG1heChtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIpKSAlPiUNCiAgbGVmdF9qb2luKC4sIHBhcmtfc3BlY2llc19yaWNobmVzcywgYnkgPSAiVW5pdENvZGUiKSAlPiUNCiAgbGVmdF9qb2luKC4sIGNvdW50X3VuaXF1ZSwgYnkgPSAiVW5pdENvZGUiKQ0KYGBgDQoNCnwgICBJbiB0b3RhbCwgd2UgaWRlbnRpZmllZCBgciBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JSB1bmdyb3VwKCkgJT4lIHNlbGVjdChTY2lOYW1lX2NvcikgJT4lIHN1bW1hcmlzZShuX2Rpc3RpbmN0KFNjaU5hbWVfY29yKSkgJT4lICBwdWxsKCkgJT4lIGFzLm51bWVyaWMoKWAgdW5pcXVlIHBsYW50IHNwZWNpZXMgd2l0aGluIHRoZSBzYWx0IG1hcnNoZXMgYXQgYWxsIDcgcGFya3MuIE1lYW4gcGxvdCBzcGVjaWVzIHJpY2huZXNzIHZhcmllZCBmcm9tIGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgc2xpY2VfbWluKG9yZGVyX2J5ID0gbWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3MsIG4gPSAxKSAlPiUgc2VsZWN0KG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzKSAlPiUgbXV0YXRlKG0gPSByb3VuZChtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzcywxKSkgJT4lIHB1bGwoKWAgYXQgYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSBtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzcywgbiA9IDEpICU+JSBzZWxlY3QoVW5pdENvZGUpICU+JSBwdWxsKClgIHRvIGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3MsIG4gPSAxKSAlPiUgc2VsZWN0KG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzKSAlPiUgbXV0YXRlKG0gPSByb3VuZChtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzcywxKSkgJT4lIHB1bGwoKWAgYXQgYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzICU+JSBzbGljZV9tYXgob3JkZXJfYnkgPSBtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzcywgbiA9IDEpICU+JSBzZWxlY3QoVW5pdENvZGUpICU+JSBwdWxsKClgIChtZWFuOiBgciBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIHVuZ3JvdXAoKSAlPiUgc3VtbWFyaXNlKHJvdW5kKG1lYW4obWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3MpLCAxKSkgJT4lIHB1bGwoKWAgwrEgYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzICU+JSB1bmdyb3VwKCkgJT4lIHN1bW1hcmlzZShyb3VuZChzZChtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzcykvc3FydChsZW5ndGgobWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3MpKSwgMSkpICU+JSBwdWxsKClgOyBUYWJsZSAyKS4gTWF4IHBsb3Qgc3BlY2llcyByaWNobmVzcyB2YXJpZWQgZnJvbSBgciBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIHNsaWNlX21pbihvcmRlcl9ieSA9IG1heF9wbG90X3NwZWNpZXNfcmljaG5lc3MsIG4gPSAxKSAlPiUgc2VsZWN0KG1heF9wbG90X3NwZWNpZXNfcmljaG5lc3MpICU+JSBwdWxsKClgIGF0IGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgc2xpY2VfbWluKG9yZGVyX2J5ID0gbWF4X3Bsb3Rfc3BlY2llc19yaWNobmVzcywgbiA9IDEpICU+JSBzZWxlY3QoVW5pdENvZGUpICU+JSBwdWxsKClgIHRvIGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbWF4X3Bsb3Rfc3BlY2llc19yaWNobmVzcywgbiA9IDEpICU+JSBzZWxlY3QobWF4X3Bsb3Rfc3BlY2llc19yaWNobmVzcykgJT4lIHB1bGwoKWAgYXQgYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzICU+JSBzbGljZV9tYXgob3JkZXJfYnkgPSBtYXhfcGxvdF9zcGVjaWVzX3JpY2huZXNzLCBuID0gMSkgJT4lIHNlbGVjdChVbml0Q29kZSkgJT4lIHB1bGwoKWAgKG1lYW46IGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgdW5ncm91cCgpICU+JSBzdW1tYXJpc2Uocm91bmQobWVhbihtYXhfcGxvdF9zcGVjaWVzX3JpY2huZXNzKSwgMCkpICU+JSBwdWxsKClgIMKxIGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgdW5ncm91cCgpICU+JSBzdW1tYXJpc2Uocm91bmQoc2QobWF4X3Bsb3Rfc3BlY2llc19yaWNobmVzcykvc3FydChsZW5ndGgobWF4X3Bsb3Rfc3BlY2llc19yaWNobmVzcykpLCAwKSkgJT4lIHB1bGwoKWA7IFRhYmxlIDIpLg0KVG90YWwgc3BlY2llcyByaWNobmVzcyB2YXJpZWQgZnJvbSBgciBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIHNsaWNlX21pbihvcmRlcl9ieSA9IHRvdGFsX2NvdW50LCBuID0gMSkgJT4lIHNlbGVjdCh0b3RhbF9jb3VudCkgJT4lIHB1bGwoKWAgYXQgYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSB0b3RhbF9jb3VudCwgbiA9IDEpICU+JSBzZWxlY3QoVW5pdENvZGUpICU+JSBwdWxsKClgIHRvIGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gdG90YWxfY291bnQsIG4gPSAxKSAlPiUgc2VsZWN0KHRvdGFsX2NvdW50KSAlPiUgcHVsbCgpYCBhdCBgciBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIHNsaWNlX21heChvcmRlcl9ieSA9IHRvdGFsX2NvdW50LCBuID0gMSkgJT4lIHNlbGVjdChVbml0Q29kZSkgJT4lIHB1bGwoKWAgKG1lYW46IGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgdW5ncm91cCgpICU+JSBzdW1tYXJpc2Uocm91bmQobWVhbih0b3RhbF9jb3VudCksIDApKSAlPiUgcHVsbCgpYCDCsSBgciBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIHVuZ3JvdXAoKSAlPiUgc3VtbWFyaXNlKHJvdW5kKHNkKHRvdGFsX2NvdW50KS9zcXJ0KGxlbmd0aCh0b3RhbF9jb3VudCkpLCAwKSkgJT4lIHB1bGwoKWA7IFRhYmxlIDIpLiBUaGUgbnVtYmVyIG9mIHNwZWNpZXMgdGhhdCB3ZXJlIHVuaXF1ZSB0byBlYWNoIHBhcmsgdmFyaWVkIGZyb20gYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSBjb3VudF91bmlxdWUsIG4gPSAxKSAlPiUgc2VsZWN0KGNvdW50X3VuaXF1ZSkgJT4lIHB1bGwoKWAgYXQgYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSBjb3VudF91bmlxdWUsIG4gPSAxKSAlPiUgc2VsZWN0KFVuaXRDb2RlKSAlPiUgcHVsbCgpYCB0byBgciBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIHNsaWNlX21heChvcmRlcl9ieSA9IGNvdW50X3VuaXF1ZSwgbiA9IDEpICU+JSBzZWxlY3QoY291bnRfdW5pcXVlKSAlPiUgcHVsbCgpYCBhdCBgciBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIHNsaWNlX21heChvcmRlcl9ieSA9IGNvdW50X3VuaXF1ZSwgbiA9IDEpICU+JSBzZWxlY3QoVW5pdENvZGUpICU+JSBwdWxsKClgIChtZWFuOiBgciBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIHVuZ3JvdXAoKSAlPiUgc3VtbWFyaXNlKHJvdW5kKG1lYW4oY291bnRfdW5pcXVlKSwgMCkpICU+JSBwdWxsKClgIMKxIGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgdW5ncm91cCgpICU+JSBzdW1tYXJpc2Uocm91bmQoc2QoY291bnRfdW5pcXVlKS9zcXJ0KGxlbmd0aChjb3VudF91bmlxdWUpKSwgMCkpICU+JSBwdWxsKClgOyBUYWJsZSAyKS4NCg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMqTm90ZTogYWNjb3JkaW5nIHRvIHRoZSBWZWdhbiBwYWNrYWdlIGRvY3MsIHlvdSBjYW4gdXNlIGVpdGhlciBhYnVuZGFuY2UgKGNvdW50cykgb3IgcGVyY2VudCBjb3Zlcg0KcGxvdF9udW1zX3Blcl95ZWFyX3Blcl9zaXRlIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlLCBVbmlxdWVJRCwgWWVhcl9jaHIpICU+JQ0KICBzdW1tYXJpc2UocGxvdF9udW0gPSBuX2Rpc3RpbmN0KEV2ZW50SUQpKQ0KDQphPC1wbG90X3ZlZ19jb3Zlcl91c2RhICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGRwbHlyOjpzZWxlY3QoVW5pdENvZGUsIFVuaXF1ZUlELCBZZWFyX2NociwgU2NpTmFtZV9jb3IsIHJlbF9wZXJjZW50X2NvdmVyKSAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUsIFVuaXF1ZUlELCBZZWFyX2NociwgU2NpTmFtZV9jb3IpICU+JQ0KICBzdW1tYXJpc2UoY292ZXIgPSBtZWFuKHJlbF9wZXJjZW50X2NvdmVyLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgI2ZpbHRlcihjb21wbGV0ZS5jYXNlcyhjb3ZlcikpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgVW5pcXVlSUQsIFllYXJfY2hyKSAlPiUNCiAgbmVzdCgpICU+JQ0KICBtdXRhdGUod2lkZSA9IG1hcChkYXRhLCB+cGl2b3Rfd2lkZXIoLngsIG5hbWVzX2Zyb20gPSAiU2NpTmFtZV9jb3IiLCB2YWx1ZXNfZnJvbSA9ICJjb3ZlciIpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoLikpLA0KICAgICAgICAgc3BlY251bWJlciA9IG1hcF9kYmwod2lkZSwgfnZlZ2FuOjpzcGVjbnVtYmVyKC54KSkpICU+JQ0KICBsZWZ0X2pvaW4oLiwgcGxvdF9udW1zX3Blcl95ZWFyX3Blcl9zaXRlLCBieSA9IGMoIlVuaXRDb2RlIiwgIlVuaXF1ZUlEIiwgIlllYXJfY2hyIikpICU+JQ0KICBtdXRhdGUoYWRqX3NwZWNfbnVtYmVyID0gc3BlY251bWJlci9wbG90X251bSkgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlLCBVbmlxdWVJRCkgJT4lDQogIHN1bW1hcmlzZShtZWFuX2Fkal9zcGVjX251bWJlciA9IG1lYW4oYWRqX3NwZWNfbnVtYmVyKSkgDQogIA0Ka3J1c2thbC50ZXN0KG1lYW5fYWRqX3NwZWNfbnVtYmVyIH4gVW5pdENvZGUsIGRhdGEgPSBhKQ0KYiA8LSBGU0E6OmR1bm5UZXN0KG1lYW5fYWRqX3NwZWNfbnVtYmVyIH4gZmFjdG9yKFVuaXRDb2RlKSwgZGF0YSA9IGEsIG1ldGhvZCA9ICJib25mZXJyb25pIikkcmVzDQpyY29tcGFuaW9uOjpjbGRMaXN0KGNvbXBhcmlzb24gPSBiJENvbXBhcmlzb24sIHAudmFsdWUgPSBiJFAuYWRqLCB0aHJlc2hvbGQgPSAwLjA1KQ0KYGBgDQoNCnwgICBNZWFuIHBsb3Qgc3BlY2llcyByaWNobmVzcyByZW1haW5lZCBsb3cgKGJldHdlZW4gYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzX3Blcl95ciAlPiUgdW5ncm91cCgpICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSBtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIsIG4gPSAxKSAlPiUgbXV0YXRlKG0gPSByb3VuZChtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIsIDEpKSAlPiUgcHVsbChtKWAgdG8gYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzX3Blcl95ciAlPiUgdW5ncm91cCgpICU+JSBmaWx0ZXIoVW5pdENvZGUgIT0gIkNBQ08iKSAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyLCBuID0gMSkgJT4lIG11dGF0ZShtID0gcm91bmQobWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyLCAxKSkgJT4lIHB1bGwobSlgKSB0aHJvdWdob3V0IHRoZSBzdHVkeSBwZXJpb2QgYXQgYWxsIHBhcmtzIGV4Y2VwdCBDQUNPIChGaWd1cmUgMSkuIEF0IENBQ08sIG1lYW4gcGxvdCBzcGVjaWVzIHJpY2huZXNzIGZsdWN0dWF0ZWQgZ3JlYXRseSBiZXR3ZWVuIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0dWR5IHBlcmlvZCBpbiAxOTk3IHRvIDIwMDUgKG1pbjogYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzX3Blcl95ciAlPiUgdW5ncm91cCgpICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNBQ08iKSAlPiUgc2xpY2VfbWluKG9yZGVyX2J5ID0gbWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyLCBuID0gMSkgJT4lIG11dGF0ZShtID0gZm9ybWF0KHJvdW5kKG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzX3Blcl95ciwgMSksbnNtYWxsID0gMSkpICU+JSBwdWxsKG0pYCBpbiBgciBwbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyICU+JSB1bmdyb3VwKCkgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiQ0FDTyIpICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSBtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIsIG4gPSAxKSAlPiUgc2VsZWN0KFllYXJfY2hyKSAlPiUgcHVsbCgpYDsgbWF4OiBgciBwbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyICU+JSB1bmdyb3VwKCkgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiQ0FDTyIpICU+JSBzbGljZV9tYXgob3JkZXJfYnkgPSBtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIsIG4gPSAxKSAlPiUgbXV0YXRlKG0gPSBmb3JtYXQocm91bmQobWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyLCAxKSxuc21hbGwgPSAxKSkgJT4lIHB1bGwobSlgIGluIGByIHBsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIgJT4lIHVuZ3JvdXAoKSAlPiUgZmlsdGVyKFVuaXRDb2RlID09ICJDQUNPIikgJT4lIHNsaWNlX21heChvcmRlcl9ieSA9IG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzX3Blcl95ciwgbiA9IDEpICU+JSBzZWxlY3QoWWVhcl9jaHIpICU+JSBwdWxsKClgKSAtIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgZmFjdCB0aGF0IGRpZmZlcmVudCBzaXRlcyAoYW5kIGRpZmZlcmVudCBudW1iZXJzIG9mIHNpdGVzKSB3ZXJlIHNhbXBsZWQgaW4gZWFjaCBzYW1wbGluZyB5ZWFyLCBpbiBjb250cmFzdCB0byB0aGUgb3RoZXIgcGFya3Mgd2hlcmUgdGhlIHNhbWUgc2l0ZXMgd2VyZSBzYW1wbGVkIGV2ZXJ5IHRpbWUuIChGaWd1cmUgMSkuIEJldHdlZW4gMjAwNSB0byAyMDE4IGhvd2V2ZXIsIG1lYW4gcGxvdCBzcGVjaWVzIHJpY2huZXNzIGF0IENBQ08gc3RhYmlsaXplZCBiZXR3ZWVuIGByIHBsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiQ0FDTyIgJiBZZWFyID4gMjAwNSkgJT4lIHNsaWNlX21pbihvcmRlcl9ieSA9IG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzX3Blcl95ciwgbiA9IDEpICU+JSBtdXRhdGUobSA9IHJvdW5kKG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzX3Blcl95ciwxKSkgJT4lIHB1bGwobSlgIGFuZCBgciBwbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNBQ08iICYgWWVhciA+IDIwMDUpICU+JSBzbGljZV9tYXgob3JkZXJfYnkgPSBtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIsIG4gPSAxKSAlPiUgbXV0YXRlKG0gPSByb3VuZChtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIsMSkpICU+JSBwdWxsKG0pYCwgc2ltaWxhciB0byB0aGUgb3RoZXIgNiBwYXJrcy4gIA0KJm5ic3A7DQoNCmBgYHtyIFRhYmxlIDIsIGVjaG89RkFMU0UsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFfQ0KZmxleHRhYmxlKHBsb3Rfc3BlY2llc19yaWNobmVzcywgY29sX2tleXMgPSBjKCJVbml0Q29kZSIsICJtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzcyIsICJtYXhfcGxvdF9zcGVjaWVzX3JpY2huZXNzIiwgInRvdGFsX2NvdW50IiwgImNvdW50X3VuaXF1ZSIpKSAlPiUNCiAgYWxpZ24oLiwgYWxpZ24gPSAiY2VudGVyIiwgcGFydCA9ICJhbGwiKSAlPiUNCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMoLiwgd2lkdGggPSAxLCBsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JQ0KICBhZGRfaGVhZGVyX2xpbmVzKC4sIHZhbHVlcyA9IGMoIlRhYmxlIDIuIFBsYW50IHNwZWNpZXMgcmljaG5lc3Mgd2l0aGluIHRoZSBzYWx0IG1hcnNoZXMgYXQgZWFjaCBwYXJrLiIpKSAlPiUNCiAgc2V0X2hlYWRlcl9sYWJlbHMoLiwgVW5pdENvZGUgPSAiUGFyayBVbml0IiwgbWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3MgPSAiTWVhbiBQbG90IFJpY2huZXNzIiwgbWF4X3Bsb3Rfc3BlY2llc19yaWNobmVzcyA9ICJNYXggUGxvdCBSaWNobmVzcyIsIHRvdGFsX2NvdW50ID0gIlRvdGFsIFJpY2huZXNzIiwgY291bnRfdW5pcXVlID0gIlVuaXF1ZSBTcGVjaWVzIENvdW50IikgJT4lDQogIGFsaWduKC4sIGkgPSAxLCBhbGlnbiA9ICJsZWZ0IiwgcGFydCA9ICJoZWFkZXIiKSAlPiUNCiAgYm9yZGVyX2lubmVyX2goLiwgYm9yZGVyID0gZnBfYm9yZGVyKGNvbG9yID0gInRyYW5zcGFyZW50IiksIHBhcnQgPSAiYm9keSIpICU+JQ0KICBjb2xmb3JtYXRfZG91YmxlKC4sIGogPSAyLCBkaWdpdHMgPSAxKSAlPiUNCiAgYWRkX2Zvb3Rlcl9yb3coLiwgdmFsdWVzID0gYygibWVhbiAowrEgMSBTRSkiLCBwYXN0ZTAocm91bmQobWVhbihwbG90X3NwZWNpZXNfcmljaG5lc3MkbWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3MpLDEpLCAiIMKxICIsIHJvdW5kKHNkKHBsb3Rfc3BlY2llc19yaWNobmVzcyRtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzcykvc3FydChsZW5ndGgocGxvdF9zcGVjaWVzX3JpY2huZXNzJG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzKSksMSkpLCBwYXN0ZTAocm91bmQobWVhbihwbG90X3NwZWNpZXNfcmljaG5lc3MkbWF4X3Bsb3Rfc3BlY2llc19yaWNobmVzcyksMCksICIgwrEgIiwgcm91bmQoc2QocGxvdF9zcGVjaWVzX3JpY2huZXNzJG1heF9wbG90X3NwZWNpZXNfcmljaG5lc3MpL3NxcnQobGVuZ3RoKHBsb3Rfc3BlY2llc19yaWNobmVzcyRtYXhfcGxvdF9zcGVjaWVzX3JpY2huZXNzKSksMCkpLCBwYXN0ZTAocm91bmQobWVhbihwbG90X3NwZWNpZXNfcmljaG5lc3MkdG90YWxfY291bnQpLDApLCAiIMKxICIsIHJvdW5kKHNkKHBsb3Rfc3BlY2llc19yaWNobmVzcyR0b3RhbF9jb3VudCkvc3FydChsZW5ndGgocGxvdF9zcGVjaWVzX3JpY2huZXNzJHRvdGFsX2NvdW50KSksMCkpLCBwYXN0ZTAocm91bmQobWVhbihwbG90X3NwZWNpZXNfcmljaG5lc3MkY291bnRfdW5pcXVlKSwgMCksICIgwrEgIiwgcm91bmQoc2QocGxvdF9zcGVjaWVzX3JpY2huZXNzJGNvdW50X3VuaXF1ZSkvc3FydChsZW5ndGgocGxvdF9zcGVjaWVzX3JpY2huZXNzJGNvdW50X3VuaXF1ZSkpLDApKSksIGNvbHdpZHRocyA9IGMoMSwxLDEsMSwxKSkgJT4lIA0KICBobGluZSguLCBpID0gNywgYm9yZGVyID0gZnBfYm9yZGVyKGNvbG9yID0gImJsYWNrIiwgd2lkdGggPSAxKSkgJT4lDQogIGhsaW5lKC4sIGJvcmRlciA9IGZwX2JvcmRlcihjb2xvciA9ICJibGFjayIsIHdpZHRoID0gMiksIHBhcnQgPSAiZm9vdGVyIikgJT4lDQogIGFsaWduKC4sIGFsaWduID0gImNlbnRlciIsIHBhcnQgPSAiZm9vdGVyIikNCmBgYA0KJm5ic3A7DQpgYGB7ciBGaWd1cmUgMiwgZWNobz1GQUxTRSwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGZpZy53aWR0aCA9IDUuODU0MTY3LCBmaWcuaGVpZ2h0ID0gMy4yMDgzMzMsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBmaWcuY2FwPSAiRmlndXJlIDIuIC4uLiIgfQ0KZ2dwbG90KHBsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIsIGFlcyh4ID0gWWVhciwgeSA9IG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzX3Blcl95cikpICsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFVuaXRDb2RlKSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IFVuaXRDb2RlKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEwKSwgc2VjLmF4aXMgPSBkdXBfYXhpcygpLCBuYW1lID0gIk1lYW4gcGxvdCByaWNobmVzcyIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKHNlYy5heGlzID0gZHVwX2F4aXMoKSwgbmFtZSA9ICJZZWFyIikgKw0KICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiUGFyayIpKSArDQogIGxmZWhlUjo6dGhlbWUoYmFzZV9zaXplID0gMTIpICsNCiAgdGhlbWUoDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAic2VyaWYiLCBzaXplID0gMTIpLA0KICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAidHJhbnNwYXJlbnQiKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXkiLCBsaW5ld2lkdGggPSAwLjUsIGxpbmV0eXBlID0gImRhc2hlZCIpDQogICkNCmBgYA0KJm5ic3A7DQoNCiMjIyMjICpSYXJlLCBUaHJlYXRlbmVkICYgRW5kYW5nZXJlZCBTcGVjaWVzKg0KYGBge3IgUmFyZSBzcGVjaWVzIGNvdW50LCBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9VFJVRSwgaW5jbHVkZT1GQUxTRX0NCnJhcmVfc3BlY2llcyA8LSBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHNlbGVjdChVbml0Q29kZSwgU2NpTmFtZV9jb3IsIHN0YXJ0c193aXRoKCJyYXJlXyIpKSAlPiUNCiAgbXV0YXRlKGlzX3JhcmUgPSBjYXNlX3doZW4oaWZfYW55KHN0YXJ0c193aXRoKCJyYXJlXyIpLCB+IC54ID09ICJUIikgfiAiVCIpKSAlPiUNCiAgZmlsdGVyKGlzX3JhcmUgPT0gIlQiKQ0KDQp0b3RhbF9yYXJlX3NwZWNpZXMgPC0gcmFyZV9zcGVjaWVzICU+JQ0KICBzdW1tYXJpc2Uobl9kaXN0aW5jdChTY2lOYW1lX2NvcikpICU+JQ0KICBwdWxsKCkgJT4lDQogIGFzLm51bWVyaWMoKQ0KYGBgDQoNCnwgICBPbmx5IGByIHJhcmVfc3BlY2llcyAlPiUgZmlsdGVyKFVuaXRDb2RlID09ICJHQVRFIikgJT4lIHN1bW1hcmlzZShtID0gbl9kaXN0aW5jdChTY2lOYW1lX2NvcikpICU+JSBwdWxsKClgIHJhcmUgc3BlY2llcyAtICpgciByYXJlX3NwZWNpZXMgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiR0FURSIpICU+JSBzdW1tYXJpc2UobSA9IHVuaXF1ZShTY2lOYW1lX2NvcikpICU+JSBwdWxsKClgKiBhdCBHQVRFIC0gd2FzIGlkZW50aWZpZWQgYWNyb3NzIGFsbCBwYXJrcy4gKmByIHJhcmVfc3BlY2llcyAlPiUgZmlsdGVyKFVuaXRDb2RlID09ICJHQVRFIikgJT4lIHN1bW1hcmlzZShtID0gdW5pcXVlKFNjaU5hbWVfY29yKSkgJT4lIHB1bGwoKWAqIHdhcyBvbmx5IGZvdW5kIGluIG9uZSBwbG90IGluIDIwMTcgYXQgR0FURS4gTm8gZmVkZXJhbGx5IGxpc3RlZCB0aHJlYXRlbmVkIG9yIGVuZGFuZ2VyZWQgc3BlY2llcyB3ZXJlIGZvdW5kIGF0IGFueSBvZiB0aGUgcGFya3MuDQombmJzcDsNCg0KYGBge3IgSW52YXNpdmUgc3BlY2llcyBjb3VudCwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQppbnZhc2l2ZV9zcGVjaWVzIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IsIHJlbF9wZXJjZW50X2NvdmVyLCBzdGFydHNfd2l0aCgiaW52YXNpdmVfIikpICU+JQ0KICBtdXRhdGUoaXNfaW52YXNpdmUgPSBjYXNlX3doZW4oaWZfYW55KHN0YXJ0c193aXRoKCJpbnZhc2l2ZV8iKSwgfiAueCA9PSAiVCIpIH4gIlQiKSkgJT4lDQogIGZpbHRlcihpc19pbnZhc2l2ZSA9PSAiVCIpDQoNCnRvdGFsX2ludmFzaXZlX3NwZWNpZXMgPC0gaW52YXNpdmVfc3BlY2llcyAlPiUNCiAgc3VtbWFyaXNlKG5fZGlzdGluY3QoU2NpTmFtZV9jb3IpKSAlPiUNCiAgcHVsbCgpICU+JQ0KICBhcy5udW1lcmljKCkNCg0KaW52YXNpdmVfc3BlY2llc19ieV9wYXJrIDwtIGludmFzaXZlX3NwZWNpZXMgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlKSAlPiUNCiAgZGlzdGluY3QoU2NpTmFtZV9jb3IpICU+JQ0KICBhcnJhbmdlKFVuaXRDb2RlLCBTY2lOYW1lX2NvcikNCg0KaW52YXNpdmVfY292ZXJfcGVyX3llYXIgPC0gaW52YXNpdmVfc3BlY2llcyAlPiUNCiAgbXV0YXRlKFllYXIgPSBhcy5pbnRlZ2VyKFllYXJfY2hyKSkgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlLCBZZWFyLCBTY2lOYW1lX2NvcikgJT4lDQogIHN1bW1hcmlzZShpbnZhc2l2ZV9jb3ZlciA9IG1lYW4ocmVsX3BlcmNlbnRfY292ZXIpKQ0KYGBgDQoNCiMjIyMjICpJbnZhc2l2ZSwgTm94aW91cyAmIFByb2hpYml0ZWQgU3BlY2llcyoNCnwgICBPZiB0aGUgYHIgdG90YWxfc3BlY2llc2AgdW5pcXVlIHNwZWNpZXMgaWRlbnRpZmllZCBhY3Jvc3MgYWxsIHBhcmtzLCBgciB0b3RhbF9pbnZhc2l2ZV9zcGVjaWVzYCB3ZXJlIGNvbnNpZGVyZWQgaW52YXNpdmUsIG5veGlvdXMsIG9yIHByb2hpYml0ZWQgd2l0aGluIHRoZWlyIHJlc3BlY3RpdmUgc3RhdGVzIChUYWJsZSAzKS4gTm8gaW52YXNpdmUgc3BlY2llcyB3ZXJlIGZvdW5kIGluIEFTSVMsIEdFV0EsIG9yIFNBSEkuIEF0IENBQ08sIGByIGludmFzaXZlX3NwZWNpZXMgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiQ0FDTyIpICU+JSB1bmdyb3VwKCkgJT4lIHJlZnJhbWUobSA9IG5fZGlzdGluY3QoU2NpTmFtZV9jb3IpKSAlPiUgcHVsbChtKWAgc3BlY2llcywgaW5jbHVkaW5nICpDZWxhc3RydXMgb3JiaWN1bGF0dXMqLCAqTG9uaWNlcmEgamFwb25pY2EqLCAqTHl0aHJ1bSBzYWxpY2FyaWEqLCAqUGhhbGFyaXMgYXJ1bmRpbmFjZWEqLCBhbmQgKlBocmFnbWl0ZXMgYXVzdHJhbGlzKiB3ZXJlIGNvbnNpZGVyZWQgaW52YXNpdmUgYnkgdGhlIE1hc3NhY2h1c2V0dHMgSW52YXNpdmUgUGxhbnQgQWR2aXNvcnkgR3JvdXAgKDxodHRwczovL21hc3NucmMub3JnL21pcGFnL2luZGV4Lmh0bT4pIChUYWJsZSAzKS4gQXQgQ09MTywgb25seSBgciBpbnZhc2l2ZV9zcGVjaWVzICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNPTE8iKSAlPiUgdW5ncm91cCgpICU+JSByZWZyYW1lKG0gPSBuX2Rpc3RpbmN0KFNjaU5hbWVfY29yKSkgJT4lIHB1bGwobSlgIHNwZWNpZXMgLSAqYHIgaW52YXNpdmVfc3BlY2llcyAlPiUgZmlsdGVyKFVuaXRDb2RlID09ICJDT0xPIikgJT4lIHVuZ3JvdXAoKSAlPiUgcHVsbChTY2lOYW1lX2NvcilgKiAtIHdhcyBjb25zaWRlcmVkIGludmFzaXZlIGJ5IHRoZSBWaXJnaW5pYSBEZXBhcnRtZW50IG9mIENvbnNlcnZhdGlvbiBhbmQgUmVjcmVhdGlvbiAoPGh0dHBzOi8vd3d3LmRjci52aXJnaW5pYS5nb3YvbmF0dXJhbC1oZXJpdGFnZS9pbnZzcHBkZmxpc3Q+KSAoVGFibGUgMykuIEF0IEZJSVMsIGByIGludmFzaXZlX3NwZWNpZXMgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiRklJUyIpICU+JSB1bmdyb3VwKCkgJT4lIHJlZnJhbWUobSA9IG5fZGlzdGluY3QoU2NpTmFtZV9jb3IpKSAlPiUgcHVsbChtKWAgc3BlY2llcywgaW5jbHVkaW5nICpFbGFlYWdudXMgdW1iZWxsYXRhKiwgKlBocmFnbWl0ZXMgYXVzdHJhbGlzKiwgYW5kICpQb2x5Z29udW0gcGVyZm9saWF0dW0qIHdlcmUgY29uc2lkZXJlZCBpbnZhc2l2ZSBieSB0aGUgc3RhdGUgb2YgTmV3IFlvcmsgKFN0YXRlIG9mIE5ldyBZb3JrLCAyMDIyKSAoVGFibGUgMykuIEF0IEdBVEUsIGByIGludmFzaXZlX3NwZWNpZXMgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiR0FURSIpICU+JSB1bmdyb3VwKCkgJT4lIHJlZnJhbWUobSA9IG5fZGlzdGluY3QoU2NpTmFtZV9jb3IpKSAlPiUgcHVsbChtKWAgc3BlY2llcywgaW5jbHVkaW5nICpBcnRlbWlzaWEgdnVsZ2FyaXMqLCAqTG9uaWNlcmEgamFwb25pY2EqLCAqUGhyYWdtaXRlcyBhdXN0cmFsaXMqLCAqUnVidXMgcGhvZW5pY29sYXNpdXMqLCB3ZXJlIGNvbnNpZGVyZWQgaW52YXNpdmUgYnkgdGhlIHN0YXRlIG9mIE5ldyBZb3JrIChTdGF0ZSBvZiBOZXcgWW9yaywgMjAyMikgKFRhYmxlIDMpLg0KDQp8ICAgUmVsYXRpdmUgY292ZXIgb2YgdGhlIG1ham9yaXR5IG9mIHRoZXNlIGludmFzaXZlIHNwZWNpZXMgZWl0aGVyIHJlbWFpbmVkIHN0YWJsZSBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHN0dWR5IHBlcmlvZCBvciB3ZXJlIG9ubHkgZm91bmQgb25jZSAoRmlndXJlIDMpLiBPZiB0aGUgdHdvIGludmFzaXZlIHNwZWNpZXMgd2l0aCBpbmNyZWFzaW5nIHJlbGF0aXZlIGNvdmVyLCAqUGhyYWdtaXRlcyBhdXN0cmFsaXMqIGF0IENBQ08gaW5jcmVhc2VkIGZyb20gYSBsb3cgb2YgYHIgaW52YXNpdmVfY292ZXJfcGVyX3llYXIgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiQ0FDTyIgJiBTY2lOYW1lX2NvciA9PSAiUGhyYWdtaXRlcyBhdXN0cmFsaXMiKSAlPiUgdW5ncm91cCgpICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSBpbnZhc2l2ZV9jb3ZlciwgbiA9IDEpICU+JSBtdXRhdGUobSA9IHJvdW5kKGludmFzaXZlX2NvdmVyLDEpKSAlPiUgcHVsbCgpYCUgaW4gYHIgaW52YXNpdmVfY292ZXJfcGVyX3llYXIgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiQ0FDTyIgJiBTY2lOYW1lX2NvciA9PSAiUGhyYWdtaXRlcyBhdXN0cmFsaXMiKSAlPiUgdW5ncm91cCgpICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSBpbnZhc2l2ZV9jb3ZlciwgbiA9IDEpICU+JSBzZWxlY3QoWWVhcikgJT4lIHB1bGwoKWAgdG8gYSBoaWdoIG9mIGByIGludmFzaXZlX2NvdmVyX3Blcl95ZWFyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNBQ08iICYgU2NpTmFtZV9jb3IgPT0gIlBocmFnbWl0ZXMgYXVzdHJhbGlzIikgJT4lIHVuZ3JvdXAoKSAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gaW52YXNpdmVfY292ZXIsIG4gPSAxKSAlPiUgbXV0YXRlKG0gPSByb3VuZChpbnZhc2l2ZV9jb3ZlciwxKSkgJT4lIHB1bGwoKWAlIGluIGByIGludmFzaXZlX2NvdmVyX3Blcl95ZWFyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNBQ08iICYgU2NpTmFtZV9jb3IgPT0gIlBocmFnbWl0ZXMgYXVzdHJhbGlzIikgJT4lIHVuZ3JvdXAoKSAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gaW52YXNpdmVfY292ZXIsIG4gPSAxKSAlPiUgc2VsZWN0KFllYXIpICU+JSBwdWxsKClgLCBhbHRob3VnaCB0aGlzIGNoYW5nZSBtYXkgYmUgcmVsYXRlZCB0byBkaWZmZXJlbmNlcyBpbiB0aGUgbnVtYmVyIG9mIHNpdGVzIHVzZWQgaW4gdGhlIGVhcmxpZXIgdnMuIGxhdGVyIHllYXJzIGF0IENBQ08uIFNpbWlsYXJseSwgdGhlIGNvdmVyIG9mICpBcnRlbWlzaWEgdnVsZ2FyaXMqIGF0IEdBVEUgaW5jcmVhc2VkIGZyb20gYSBsb3cgb2YgYHIgaW52YXNpdmVfY292ZXJfcGVyX3llYXIgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiR0FURSIgJiBTY2lOYW1lX2NvciA9PSAiQXJ0ZW1pc2lhIHZ1bGdhcmlzIikgJT4lIHVuZ3JvdXAoKSAlPiUgc2xpY2VfbWluKG9yZGVyX2J5ID0gaW52YXNpdmVfY292ZXIsIG4gPSAxKSAlPiUgbXV0YXRlKG0gPSByb3VuZChpbnZhc2l2ZV9jb3ZlciwxKSkgJT4lIHB1bGwoKWAlIGluIGByIGludmFzaXZlX2NvdmVyX3Blcl95ZWFyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkdBVEUiICYgU2NpTmFtZV9jb3IgPT0gIkFydGVtaXNpYSB2dWxnYXJpcyIpICU+JSB1bmdyb3VwKCkgJT4lIHNsaWNlX21pbihvcmRlcl9ieSA9IGludmFzaXZlX2NvdmVyLCBuID0gMSkgJT4lIHNlbGVjdChZZWFyKSAlPiUgcHVsbCgpYCB0byBhIGhpZ2ggb2YgYHIgaW52YXNpdmVfY292ZXJfcGVyX3llYXIgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiR0FURSIgJiBTY2lOYW1lX2NvciA9PSAiQXJ0ZW1pc2lhIHZ1bGdhcmlzIikgJT4lIHVuZ3JvdXAoKSAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gaW52YXNpdmVfY292ZXIsIG4gPSAxKSAlPiUgbXV0YXRlKG0gPSByb3VuZChpbnZhc2l2ZV9jb3ZlciwxKSkgJT4lIHB1bGwoKWAlIGluIGByIGludmFzaXZlX2NvdmVyX3Blcl95ZWFyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkdBVEUiICYgU2NpTmFtZV9jb3IgPT0gIkFydGVtaXNpYSB2dWxnYXJpcyIpICU+JSB1bmdyb3VwKCkgJT4lIHNsaWNlX21heChvcmRlcl9ieSA9IGludmFzaXZlX2NvdmVyLCBuID0gMSkgJT4lIHNlbGVjdChZZWFyKSAlPiUgcHVsbCgpYCAoRmlndXJlIDMpLiBPbmx5IDEgaW52YXNpdmUgc3BlY2llcywgKlBoYWxhcmlzIGFydW5kaW5hY2VhKiBhdCBDQUNPIGRlY3JlYXNlZCBzdWJzdGFudGlhbGx5IGZyb20gYSBoaWdoIG9mIGByIGludmFzaXZlX2NvdmVyX3Blcl95ZWFyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNBQ08iICYgU2NpTmFtZV9jb3IgPT0gIlBoYWxhcmlzIGFydW5kaW5hY2VhIikgJT4lIHVuZ3JvdXAoKSAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gaW52YXNpdmVfY292ZXIsIG4gPSAxKSAlPiUgbXV0YXRlKG0gPSByb3VuZChpbnZhc2l2ZV9jb3ZlciwxKSkgJT4lIHB1bGwoKWAlIGluIGByIGludmFzaXZlX2NvdmVyX3Blcl95ZWFyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNBQ08iICYgU2NpTmFtZV9jb3IgPT0gIlBoYWxhcmlzIGFydW5kaW5hY2VhIikgJT4lIHVuZ3JvdXAoKSAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gaW52YXNpdmVfY292ZXIsIG4gPSAxKSAlPiUgc2VsZWN0KFllYXIpICU+JSBwdWxsKClgIHRvIGEgbG93IG9mIGByIGludmFzaXZlX2NvdmVyX3Blcl95ZWFyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNBQ08iICYgU2NpTmFtZV9jb3IgPT0gIlBoYWxhcmlzIGFydW5kaW5hY2VhIikgJT4lIHVuZ3JvdXAoKSAlPiUgc2xpY2VfbWluKG9yZGVyX2J5ID0gaW52YXNpdmVfY292ZXIsIG4gPSAxKSAlPiUgbXV0YXRlKG0gPSByb3VuZChpbnZhc2l2ZV9jb3ZlciwxKSkgJT4lIHB1bGwoKWAlIGluIGByIGludmFzaXZlX2NvdmVyX3Blcl95ZWFyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNBQ08iICYgU2NpTmFtZV9jb3IgPT0gIlBoYWxhcmlzIGFydW5kaW5hY2VhIikgJT4lIHVuZ3JvdXAoKSAlPiUgc2xpY2VfbWluKG9yZGVyX2J5ID0gaW52YXNpdmVfY292ZXIsIG4gPSAxKSAlPiUgc2VsZWN0KFllYXIpICU+JSBwdWxsKClgIChGaWd1cmUgMykuDQombmJzcDsNCg0KYGBge3IgVGFibGUgMywgZWNobz1GQUxTRSwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIHBhZ2VkLnByaW50PVRSVUV9DQpmbGV4dGFibGUoaW52YXNpdmVfc3BlY2llc19ieV9wYXJrLCBjb2xfa2V5cyA9IGMoIlVuaXRDb2RlIiwgIlNjaU5hbWVfY29yIikpICU+JQ0KICBhbGlnbiguLCBhbGlnbiA9ICJjZW50ZXIiLCBwYXJ0ID0gImFsbCIpICU+JQ0KICBzZXRfdGFibGVfcHJvcGVydGllcyguLCBsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JQ0KICBhZGRfaGVhZGVyX2xpbmVzKC4sIHZhbHVlcyA9IGMoIlRhYmxlIDMuIEludmFzaXZlLCBub3hpb3VzLCBvciBwcm9oaWJpdGVkIHNwZWNpZXMgZm91bmQgYXQgZWFjaCBwYXJrLiIpKSAlPiUNCiAgc2V0X2hlYWRlcl9sYWJlbHMoLiwgVW5pdENvZGUgPSAiUGFyayB1bml0IiwgU2NpTmFtZV9jb3IgPSAiU3BlY2llcyIpICU+JQ0KICBhbGlnbiguLCBpID0gMSwgYWxpZ24gPSAibGVmdCIsIHBhcnQgPSAiaGVhZGVyIikgJT4lDQogIGJvcmRlcl9pbm5lcl9oKC4sIGJvcmRlciA9IGZwX2JvcmRlcihjb2xvciA9ICJ0cmFuc3BhcmVudCIpLCBwYXJ0ID0gImJvZHkiKSAlPiUNCiAgc3R5bGUoaiA9IDIsIHByX3QgPSBmcF90ZXh0X2RlZmF1bHQoaXRhbGljID0gVFJVRSkpICU+JQ0KICBobGluZSguLCBpID0gYyg1LDYsOSksIGJvcmRlciA9IGZwX2JvcmRlcihjb2xvciA9ICJibGFjayIsIHdpZHRoID0gMSkpICU+JQ0KICBobGluZSguLCBib3JkZXIgPSBmcF9ib3JkZXIoY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9IDIpLCBwYXJ0ID0gImZvb3RlciIpICU+JQ0KICBtZXJnZV92KC4sIGogPSAxKSAlPiUNCiAgZml4X2JvcmRlcl9pc3N1ZXMoKSAlPiUNCiAgcGFkZGluZyguLCBpID0gYygxLCA2LCA3LCAxMCksIGogPSAyLCBwYWRkaW5nLnRvcCA9IDUpICU+JQ0KICBwYWRkaW5nKC4sIGkgPSBjKDUsIDYsIDksIDEzKSwgaiA9IDIsIHBhZGRpbmcuYm90dG9tID0gNSkNCmBgYA0KJm5ic3A7DQoNCmBgYHtyIEZpZ3VyZSA0LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KGludmFzaXZlX2NvdmVyX3Blcl95ZWFyLCBhZXMoeCA9IFllYXIsIHkgPSBpbnZhc2l2ZV9jb3ZlcikpICsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFNjaU5hbWVfY29yKSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IFNjaU5hbWVfY29yKSkgKw0KICBnZW9tX3RleHQoZGF0YSA9DQogICAgICAgICAgICAgIGRhdGEuZnJhbWUoVW5pdENvZGUgPSBjKCJDQUNPIiwgIkNPTE8iLCAiRklJUyIsICJHQVRFIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlciA9IExFVFRFUlNbMTo0XSksDQogICAgICAgICAgICBhZXMoeCA9IDE5OTcsIHkgPSAgOTMsIGxhYmVsID0gcGFzdGUwKGxldHRlciwgIi4gIiwgVW5pdENvZGUpKSwNCiAgICAgICAgICAgIGhqdXN0ID0gMCwgZmFtaWx5ID0gInNlcmlmIikgKw0KICBsZW1vbjo6ZmFjZXRfcmVwX3dyYXAoflVuaXRDb2RlLCByZXBlYXQudGljay5sYWJlbHMgPSBUKSArDQogIHNjYWxlX3lfY29udGludW91cyhzZWMuYXhpcyA9IGR1cF9heGlzKCksIG5hbWUgPSAiTWVhbiByZWxhdGl2ZSBjb3ZlciAoJSkiKSArDQogIHNjYWxlX3hfY29udGludW91cyhzZWMuYXhpcyA9IGR1cF9heGlzKCksIG5hbWUgPSAiWWVhciIpICsNCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIlNwZWNpZXMiKSkgKw0KICBsZmVoZVI6OnRoZW1lKGJhc2Vfc2l6ZSA9IDEyKSArDQogIHRoZW1lKA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gInNlcmlmIiwgc2l6ZSA9IDEyKSwNCiAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9yZWN0KGNvbG9yID0gInRyYW5zcGFyZW50IiksDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXkiLCBsaW5ld2lkdGggPSAwLjUsIGxpbmV0eXBlID0gImRhc2hlZCIpLA0KICAgIHBhbmVsLnNwYWNpbmcueSA9IHVuaXQoNSwibW0iKSwNCiAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KYGBgDQombmJzcDsNCg0KIyMjIyMgKldldGxhbmQgU3BlY2llcyoNCmBgYHtyIFdldGxhbmQgc3BlY2llcywgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQp3ZXRsYW5kX3NwZWNpZXMgPC0gcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBmaWx0ZXIoU2NpTmFtZV9jb3IgIT0gIlJ1cHBpYSBtYXJpdGltYSIpICU+JSAjIGV4Y2x1ZGUgcnVwcGlhIGNvdmVyIC0gc2hvdWxkbid0IGhhdmUgYmVlbiBjb3VudGVkIGFzIGEgc2FsdCBtYXJzaCBzcGVjaWVzDQogIHNlbGVjdChVbml0Q29kZSwgWWVhcl9jaHIsIHJlbF9wZXJjZW50X2NvdmVyLCBTY2lOYW1lX2Nvciwgd2V0bGFuZF9zdGF0dXMpICU+JQ0KICBmaWx0ZXIod2V0bGFuZF9zdGF0dXMgJWluJSBjKCJPQkwiLCAiRkFDVyIsICJGQUMiKSkgDQoNCnRvdGFsX3dldGxhbmRfc3BlY2llcyA8LSB3ZXRsYW5kX3NwZWNpZXMgJT4lDQogIHN1bW1hcmlzZShuX2Rpc3RpbmN0KFNjaU5hbWVfY29yKSkgJT4lDQogIHB1bGwoKSAlPiUNCiAgYXMubnVtZXJpYygpDQoNCndldGxhbmRfc3BlY2llc19wZXJfcGFyayA8LSB3ZXRsYW5kX3NwZWNpZXMgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlKSAlPiUNCiAgZGlzdGluY3QoU2NpTmFtZV9jb3IpICU+JQ0KICBhcnJhbmdlKFVuaXRDb2RlLCBTY2lOYW1lX2NvcikNCg0Kd2V0bGFuZF9zcGVjaWVzX2NvdW50X3Blcl9wYXJrIDwtIHdldGxhbmRfc3BlY2llc19wZXJfcGFyayAlPiUNCiAgc3VtbWFyaXNlKHNwZWNpZXNfY291bnQgPSBuX2Rpc3RpbmN0KFNjaU5hbWVfY29yKSkNCg0KdG90YWxfd2V0bGFuZF9jb3Zlcl9wZXJfeWVhciA8LSB3ZXRsYW5kX3NwZWNpZXMgJT4lDQogIG11dGF0ZShZZWFyID0gYXMuaW50ZWdlcihZZWFyX2NocikpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgWWVhcikgJT4lDQogIHN1bW1hcmlzZSh3ZXRsYW5kX2NvdmVyID0gbWVhbihyZWxfcGVyY2VudF9jb3ZlcikpIA0KDQp3ZXRsYW5kX2NvdmVyX3RvcDUgPC0gcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3QoVW5pdENvZGUsIFllYXJfY2hyLCBQZXJjZW50Q292ZXIsIHRvdGFsX3BlcmNlbnRfY292ZXIsIHJlbF9wZXJjZW50X2NvdmVyLCBTY2lOYW1lX2Nvciwgd2V0bGFuZF9zdGF0dXMpICU+JQ0KICBtdXRhdGUoaXNfd2V0bGFuZCA9IGlmX2Vsc2Uod2V0bGFuZF9zdGF0dXMgJWluJSBjKCJPQkwiLCAiRkFDVyIsICJGQUMiKSwgIlQiLCBOQSkpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IpICU+JQ0KICBtdXRhdGUodG90YWxfY292ZXJfc3BlY2llcyA9IHN1bShyZWxfcGVyY2VudF9jb3ZlcikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlLCBZZWFyX2NocikgJT4lDQogIG11dGF0ZSh0b3RhbF9jb3ZlciA9IHN1bSh0b3RhbF9wZXJjZW50X2NvdmVyKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUsIFllYXJfY2hyLCBTY2lOYW1lX2NvcikgJT4lDQogIGZpbHRlcihpc193ZXRsYW5kID09ICJUIikgJT4lDQogIHN1bW1hcmlzZShtZWFuX3JlbF9jb3Zlcl9zcGVjaWVzID0gbWVhbih0b3RhbF9jb3Zlcl9zcGVjaWVzL3RvdGFsX2NvdmVyLCBuYS5ybSA9VCApKjEwMCkgJT4lDQogIGZpbHRlcihTY2lOYW1lX2NvciAhPSAiUnVwcGlhIG1hcml0aW1hIikgJT4lICMgZXhjbHVkZSBydXBwaWEgY292ZXIgLSBzaG91bGRuJ3QgaGF2ZSBiZWVuIGNvdW50ZWQgYXMgYSBzYWx0IG1hcnNoIHNwZWNpZXMNCiAgZ3JvdXBfYnkoVW5pdENvZGUsIFNjaU5hbWVfY29yKSAlPiUNCiAgc3VtbWFyaXNlKHBhcmtfbWVhbl9yZWxfY292ZXIgPSBtZWFuKG1lYW5fcmVsX2NvdmVyX3NwZWNpZXMsIG5hLnJtID0gVCkpICU+JQ0KICBzbGljZV9tYXgobiA9IDUsIG9yZGVyX2J5ID0gcGFya19tZWFuX3JlbF9jb3ZlcikgJT4lDQogIGFycmFuZ2UoVW5pdENvZGUsIGRlc2MocGFya19tZWFuX3JlbF9jb3ZlcikpDQpgYGANCg0KfCAgIE9mIHRoZSBgciB0b3RhbF9zcGVjaWVzYCB1bmlxdWUgc3BlY2llcyBpZGVudGlmaWVkIGFjcm9zcyBhbGwgcGFya3MsIGByIHRvdGFsX3dldGxhbmRfc3BlY2llc2Agd2VyZSBjb25zaWRlcmVkIGh5ZHJvcGh5dGljIGluIHRoZSBub3J0aGVhc3Qgd2V0bGFuZCByZWdpb24gKFUuUy4gQXJteSBDb3JwcyBvZiBFbmdpbmVlcnMgMjAwOSkgYmFzZWQgb24gdGhlaXIgY2hhcmFjdGVyaXphdGlvbiBhcyBlaXRoZXIgb2JsaWdhdGUsIGZhY3VsdGF0aXZlIHdldGxhbmQsIG9yIGZhY3VsYXRpdmUgb24gdGhlIE5hdGlvbmFsIFdldGxhbmQgUGxhbnQgTGlzdCAoTGljaHZhciBldCBhbC4gMjAxNikuIFRvdGFsIHdldGxhbmQgc3BlY2llcyByaWNobmVzcyByYW5nZWQgZnJvbSBhIGxvdyBvZiBgciB3ZXRsYW5kX3NwZWNpZXNfY291bnRfcGVyX3BhcmsgJT4lIHNsaWNlX21pbihvcmRlcl9ieSA9IHNwZWNpZXNfY291bnQsIG4gPSAxKSAlPiUgcHVsbChzcGVjaWVzX2NvdW50KWAgYXQgYHIgd2V0bGFuZF9zcGVjaWVzX2NvdW50X3Blcl9wYXJrICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSBzcGVjaWVzX2NvdW50LCBuID0gMSkgJT4lIHB1bGwoVW5pdENvZGUpYCB0byBhIGhpZ2ggb2YgYHIgd2V0bGFuZF9zcGVjaWVzX2NvdW50X3Blcl9wYXJrICU+JSBzbGljZV9tYXgob3JkZXJfYnkgPSBzcGVjaWVzX2NvdW50LCBuID0gMSkgJT4lIHB1bGwoc3BlY2llc19jb3VudClgIGF0IGByIHdldGxhbmRfc3BlY2llc19jb3VudF9wZXJfcGFyayAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gc3BlY2llc19jb3VudCwgbiA9IDEpICU+JSBwdWxsKFVuaXRDb2RlKWAgKG1lYW46IGByIHdldGxhbmRfc3BlY2llc19jb3VudF9wZXJfcGFyayAlPiUgdW5ncm91cCgpICU+JSBzdW1tYXJpc2UobSA9IHJvdW5kKG1lYW4oc3BlY2llc19jb3VudCksMCkpICU+JSBwdWxsIChtKWAgwrEgYHIgd2V0bGFuZF9zcGVjaWVzX2NvdW50X3Blcl9wYXJrICU+JSB1bmdyb3VwKCkgJT4lIHN1bW1hcmlzZShtID0gcm91bmQoc2Qoc3BlY2llc19jb3VudCkvc3FydChsZW5ndGgoc3BlY2llc19jb3VudCkpLDApKSAlPiUgcHVsbCAobSlgOyBUYWJsZSA0KS4NCiZuYnNwOw0KDQpgYGB7ciBUYWJsZSA0LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZmxleHRhYmxlKHdldGxhbmRfc3BlY2llc19jb3VudF9wZXJfcGFyaywgY29sX2tleXMgPSBjKCJVbml0Q29kZSIsICJzcGVjaWVzX2NvdW50IikpICU+JQ0KICBhbGlnbiguLCBhbGlnbiA9ICJjZW50ZXIiLCBwYXJ0ID0gImFsbCIpICU+JQ0KICBzZXRfdGFibGVfcHJvcGVydGllcyguLCBsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JQ0KICBhZGRfaGVhZGVyX2xpbmVzKC4sIHZhbHVlcyA9IGMoIlRhYmxlIDQuIFRvdGFsIGh5ZHJvcGh5dGUgc3BlY2llcyByaWNobmVzcyBhdCBlYWNoIHBhcmsgdW5pdC4iKSkgJT4lDQogIHNldF9oZWFkZXJfbGFiZWxzKC4sIFVuaXRDb2RlID0gIlBhcmsgdW5pdCIsIHNwZWNpZXNfY291bnQgPSAiVG90YWwgaHlkcm9waHl0ZSBzcGVjaWVzIHJpY2huZXNzIikgJT4lDQogIGFsaWduKC4sIGkgPSAxLCBhbGlnbiA9ICJsZWZ0IiwgcGFydCA9ICJoZWFkZXIiKSAlPiUNCiAgYm9yZGVyX2lubmVyX2goLiwgYm9yZGVyID0gZnBfYm9yZGVyKGNvbG9yID0gInRyYW5zcGFyZW50IiksIHBhcnQgPSAiYm9keSIpICU+JQ0KICBhZGRfZm9vdGVyX3JvdyguLCB2YWx1ZXMgPSBjKCJtZWFuICgrLy0gMSBTRSkiLCBwYXN0ZTAocm91bmQobWVhbih3ZXRsYW5kX3NwZWNpZXNfY291bnRfcGVyX3Bhcmskc3BlY2llc19jb3VudCksMCksICIgKy8tICIsIHJvdW5kKHNkKHdldGxhbmRfc3BlY2llc19jb3VudF9wZXJfcGFyayRzcGVjaWVzX2NvdW50KS9zcXJ0KGxlbmd0aCh3ZXRsYW5kX3NwZWNpZXNfY291bnRfcGVyX3Bhcmskc3BlY2llc19jb3VudCkpLDApKSksIGNvbHdpZHRocyA9IGMoMSwxKSkgJT4lIA0KICBobGluZSguLCBpID0gNywgYm9yZGVyID0gZnBfYm9yZGVyKGNvbG9yID0gImJsYWNrIiwgd2lkdGggPSAxKSkgJT4lDQogIGhsaW5lKC4sIGJvcmRlciA9IGZwX2JvcmRlcihjb2xvciA9ICJibGFjayIsIHdpZHRoID0gMiksIHBhcnQgPSAiZm9vdGVyIikgJT4lDQogIGFsaWduKC4sIGFsaWduID0gImNlbnRlciIsIHBhcnQgPSAiZm9vdGVyIikNCmBgYA0KJm5ic3A7DQoNCmBgYHtyIFRhYmxlIDUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFfQ0KZmxleHRhYmxlKHdldGxhbmRfY292ZXJfdG9wNSwgY29sX2tleXMgPSBjKCJVbml0Q29kZSIsICJTY2lOYW1lX2NvciIsICJwYXJrX21lYW5fcmVsX2NvdmVyIikpICU+JQ0KICBhbGlnbiguLCBhbGlnbiA9ICJjZW50ZXIiLCBwYXJ0ID0gImFsbCIpICU+JQ0KICBzZXRfdGFibGVfcHJvcGVydGllcyguLCBsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JQ0KICBhZGRfaGVhZGVyX2xpbmVzKC4sIHZhbHVlcyA9IGMoIlRhYmxlIDUuIEh5ZHJvcGh5dGljIHBsYW50IGNvdmVyIHNwZWNpZXMgd2l0aCB0aGUgdG9wIDUgaGlnaGVzdCByZWxhdGl2ZVxubWVhbiBjb3ZlciBhdCBlYWNoIHBhcmsgYWNjcm9zcyBhbGwgeWVhcnMuIikpICU+JQ0KICBzZXRfaGVhZGVyX2xhYmVscyguLCBVbml0Q29kZSA9ICJQYXJrIHVuaXQiLCBTY2lOYW1lX2NvciA9ICJTcGVjaWVzIiwgcGFya19tZWFuX3JlbF9jb3ZlciA9ICJDb3ZlciAoJSkiKSAlPiUNCiAgYWxpZ24oLiwgaSA9IDEsIGFsaWduID0gImxlZnQiLCBwYXJ0ID0gImhlYWRlciIpICU+JQ0KICBib3JkZXJfaW5uZXJfaCguLCBib3JkZXIgPSBmcF9ib3JkZXIoY29sb3IgPSAidHJhbnNwYXJlbnQiKSwgcGFydCA9ICJib2R5IikgJT4lDQogIHN0eWxlKGogPSAyLCBwcl90ID0gZnBfdGV4dF9kZWZhdWx0KGl0YWxpYyA9IFRSVUUpKSAlPiUNCiAgY29sZm9ybWF0X2RvdWJsZSguLCBqID0gMywgZGlnaXRzID0gMSkgJT4lDQogICMgaGxpbmUoLiwgaSA9IGMoNSw2LDkpLCBib3JkZXIgPSBmcF9ib3JkZXIoY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9IDEpKSAlPiUNCiAgIyBobGluZSguLCBib3JkZXIgPSBmcF9ib3JkZXIoY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9IDIpLCBwYXJ0ID0gImZvb3RlciIpICU+JQ0KICBtZXJnZV92KC4sIGogPSAxKSAlPiUNCiAgZml4X2JvcmRlcl9pc3N1ZXMoKSAlPiUNCiAgcGFkZGluZyguLCBpID0gYygxLCA2LCAxMSwgMTYsIDIxLCAyNiwgMzEpLCBqID0gMiwgcGFkZGluZy50b3AgPSA1KSAlPiUNCiAgcGFkZGluZyguLCBpID0gYyg1LCAxMCwgMTUsIDIwLCAyNSwgMzApLCBqID0gMiwgcGFkZGluZy5ib3R0b20gPSA1KQ0KYGBgDQombmJzcDsNCg0KYGBge3IgRmlndXJlIDUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFfQ0KZ2dwbG90KHdldGxhbmRfY292ZXJfcGVyX3llYXIsIGFlcyh4ID0gWWVhciwgeSA9IHdldGxhbmRfY292ZXIpKSArDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBVbml0Q29kZSkpIA0KYGBgDQombmJzcDsNCmBgYHtyLCBmaWcud2lkdGg9NC42NDU4MzMsIGZpZy5oZWlnaHQ9My45MTY2Njd9DQp3ZXRsYW5kX3NwZWNpZXMgJT4lDQogIGZpbHRlcihVbml0Q29kZSA9PSAiQVNJUyIpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIsIFNjaU5hbWVfY29yKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fcmVsX2NvdmVyID0gbWVhbihyZWxfcGVyY2VudF9jb3ZlciwgbmEucm0gPVQpKSAlPiUNCiAgcGl2b3Rfd2lkZXIoLiwgaWRfY29scyA9IGMoIlVuaXRDb2RlIiwgIlllYXJfY2hyIiksIG5hbWVzX2Zyb20gPSBTY2lOYW1lX2NvciwgdmFsdWVzX2Zyb20gPSBjKG1lYW5fcmVsX2NvdmVyKSwgdmFsdWVzX2ZpbGwgPSAwKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKC4sIGNvbHMgPSAtYygiVW5pdENvZGUiLCAiWWVhcl9jaHIiKSwgbmFtZXNfdG8gPSAiU2NpTmFtZV9jb3IiLCB2YWx1ZXNfdG8gPSAibWVhbl9yZWxfY292ZXIiKSAlPiUNCiAgbXV0YXRlKGNvdmVyX2NhdGVnb3J5ID0gZmFjdG9yKGNhc2Vfd2hlbigNCiAgICBtZWFuX3JlbF9jb3ZlciA9PSAwIH4gTkEsDQogICAgbWVhbl9yZWxfY292ZXIgPiAwICYgbWVhbl9yZWxfY292ZXIgPCAyIH4gImIxJSIsDQogICAgbWVhbl9yZWxfY292ZXIgPiAyICYgbWVhbl9yZWxfY292ZXIgPD0gNCB+ICJjMi00JSIsDQogICAgbWVhbl9yZWxfY292ZXIgPiA0ICYgbWVhbl9yZWxfY292ZXIgPD0gOSB+ICJkNS05JSIsDQogICAgbWVhbl9yZWxfY292ZXIgPiA5ICYgbWVhbl9yZWxfY292ZXIgPD0gMjQgfiAiZTEwLTI0JSIsDQogICAgbWVhbl9yZWxfY292ZXIgPiAyNSAmIG1lYW5fcmVsX2NvdmVyIDw9IDQ5IH4gImYyNS00OSUiLA0KICAgIG1lYW5fcmVsX2NvdmVyID4gNDkgJiBtZWFuX3JlbF9jb3ZlciA8PSA3NCB+ICJnNTAtNzQlIiwNCiAgICBtZWFuX3JlbF9jb3ZlciA+IDc0IH4gImg3NS0xMDAlIg0KICApKSkgJT4lDQogIG11dGF0ZShTY2lOYW1lX2NvciA9IGZhY3RvcihTY2lOYW1lX2NvciwgbGV2ZWxzPXJldihzb3J0KHVuaXF1ZShTY2lOYW1lX2NvcikpKSkpICU+JQ0KICBnZ3Bsb3QoLiwgYWVzKHggPSBZZWFyX2NociwgeSA9IFNjaU5hbWVfY29yLCBmaWxsID0gY292ZXJfY2F0ZWdvcnkpKSArDQogIGdlb21fdGlsZShjb2xvciA9ICJsaWdodCBncmV5Iiwgc2l6ZSA9IDAuMjUpICsNCiAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQgPSBjKDAsMCksIG5hbWUgPSAiIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMCwwKSwgbmFtZSA9ICIiKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHR5cGUgPSAic2VxIiwgcGFsZXR0ZSA9ICJZbEduIiwgbmFtZSA9ICJNZWFuIHJlbGF0aXZlXG5jb3ZlciAoJSkiKSArDQogIGxmZWhlUjo6dGhlbWUoKSArDQogIHRoZW1lX2dyZXkoYmFzZV9zaXplPTgpICsNCiAgdGhlbWUoDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siLCBmaWxsID0gInRyYW5zcGFyZW50IiksDQogICAgYXhpcy50aWNrcz1lbGVtZW50X2xpbmUobGluZXdpZHRoPTAuNCkNCiAgKQ0KYGBgDQoNCiZuYnNwOw0KDQojIyMjIyAqKkRpc2N1c3Npb24qKg0KU3BlY2llcyByaWNobmVzcyBwZXIgcGxvdCBhdCBhbGwgcGFya3MgKGV4Y2VwdCBDQUNPIHByaW9yIHRvIDIwMDUpIHdhcyBzaW1pbGFyIHRvIHRoYXQgb2Ygb3RoZXIgc2FsdCBtYXJzaGVzIGFsb25nIHRoZSBlYXN0ZXJuIEF0bGFudGljIGNvYXN0IG9mIE5vcnRoIEFtZXJpY2EgKGNpdGF0aW9ucyBoZXJlKS4NCg0KTGl0ZXJhdHVyZSBDaXRlZA0KDQpMaWNodmFyLCBSLlcuLCBELkwuIEJhbmtzLCBXLk4uIEtpcmNobmVyLCBhbmQgTi5DLiBNZWx2aW4uIDIwMTYuIFRoZSBOYXRpb25hbCBXZXRsYW5kIFBsYW50IExpc3Q6IDIwMTYgd2V0bGFuZCByYXRpbmdzLiBQaHl0b25ldXJvbiAyMDE2LTMwOiAxLTE3LiAoU2VlIGFsc28gdGhlIG9mZmljaWFsIHdlYnNpdGUgb2YgdGhlIE5hdGlvbmFsIFdldGxhbmQgUGxhbnQgTGlzdC4pDQoNClN0YXRlIG9mIE5ldyBZb3JrLiAyMDIyLsKgW05ldyBZb3JrIExhd3MsIEVudmlyb25tZW50YWwgQ29uc2VydmF0aW9uIMKnIDktMTcwXShodHRwczovL2xhdy5qdXN0aWEuY29tL2NvZGVzL25ldy15b3JrLzIwMjIvZW52L2FydGljbGUtOS90aXRsZS0xNy85LTE3MDkvKS4gTmV3IFlvcmsgRGVwYXJ0bWVudCBvZiBTdGF0ZS4gMjAyMS7CoFs2IE5ldyBZb3JrIENvZGVzLCBSdWxlcyBhbmQgUmVndWxhdGlvbnMgUGFydCA1NzU6IFByb2hpYml0ZWQgYW5kIFJlZ3VsYXRlZCBJbnZhc2l2ZSBTcGVjaWVzXShodHRwczovL2dvdnQud2VzdGxhdy5jb20vbnljcnIvQnJvd3NlL0hvbWUvTmV3WW9yay9OZXdZb3JrQ29kZXNSdWxlc2FuZFJlZ3VsYXRpb25zP2d1aWQ9SWU4ZDNlN2IwMzM5NjExZTRiYWEyMDAwMDg0NWI4ZDNlJm9yaWdpbmF0aW9uQ29udGV4dD1kb2N1bWVudHRvYyZ0cmFuc2l0aW9uVHlwZT1EZWZhdWx0JmNvbnRleHREYXRhPShzYy5EZWZhdWx0KSkuDQoNClUuUy4gQXJteSBDb3JwcyBvZiBFbmdpbmVlcnMuIDIwMDkuIFJlZ2lvbmFsIHN1cHBsZW1lbnQgdG8gdGhlIENvcnBzIG9mIEVuZ2luZWVycyBXZXRsYW5kIERlbGluZWF0aW9uIE1hbnVhbDogTm9ydGhjZW50cmFsIGFuZCBOb3J0aGVhc3QgUmVnaW9uLiBVLlMuIEFybXkgQ29ycHMgb2YgRW5naW5lZXJzLCBFbmdpbmVlciBSZXNlYXJjaCBhbmQgRGV2ZWxvcG1lbnQgQ2VudGVyLCBFbnZpcm9ubWVudGFsIExhYm9yYXRvcnkgRVJEQy9FTCBUUi0wOS0xOS4NCg0KYGBge3IgQXBwZW5kaXggMTogU3BlY2llcyBsaXN0cyBmb3IgZWFjaCBwYXJrLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3BlY2llc19saXN0X3RhYmxlX2Z1biA8LSBmdW5jdGlvbihwYXJrX2NvZGUsIGxldHRlciwgcGFyaykgew0KICBzcGVjaWVzX3Blcl9wYXJrICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBmaWx0ZXIoVW5pdENvZGUgPT0gcGFya19jb2RlKSAlPiUNCiAgICBzZWxlY3QoU2NpTmFtZV9jb3IpICU+JQ0KICAgIGFycmFuZ2UoU2NpTmFtZV9jb3IpICU+JQ0KICAgIGxlZnRfam9pbiguLCBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JSB1bmdyb3VwKCkgJT4lIHNlbGVjdChTY2lOYW1lX2NvciwgQ29tbW9uTmFtZSwgQWNjZXB0ZWRTeW1ib2wpICU+JSBkaXN0aW5jdChTY2lOYW1lX2NvciwgQ29tbW9uTmFtZSwgQWNjZXB0ZWRTeW1ib2wpLCBieSA9ICJTY2lOYW1lX2NvciIpICU+JQ0KICAgIGZsZXh0YWJsZSguKSAlPiUNCiAgICBhbGlnbiguLCBhbGlnbiA9ICJjZW50ZXIiLCBwYXJ0ID0gImFsbCIpICU+JQ0KICAgIHNldF90YWJsZV9wcm9wZXJ0aWVzKC4sIGxheW91dCA9ICJhdXRvZml0IikgJT4lDQogICAgYWRkX2hlYWRlcl9saW5lcyguLCB2YWx1ZXMgPSBjKHBhc3RlMCgiQXBwZW5kaXggMSIsIGxldHRlciwgIi4gU2FsdCBtYXJzaCBwbGFudCBzcGVjaWVzIGxpc3QgZm9yICIsIHBhcmssICIuIikpKSAlPiUNCiAgICBzZXRfaGVhZGVyX2xhYmVscyguLCBTY2lOYW1lX2NvciA9ICJTcGVjaWVzIiwgQ29tbW9uTmFtZSA9ICJDb21tb24gTmFtZSIsIEFjY2VwdGVkU3ltYm9sID0gIlVTREEgU3ltYm9sIikgJT4lDQogICAgYWxpZ24oLiwgaSA9IDEsIGFsaWduID0gImxlZnQiLCBwYXJ0ID0gImhlYWRlciIpICU+JQ0KICAgIGJvcmRlcl9pbm5lcl9oKC4sIGJvcmRlciA9IGZwX2JvcmRlcihjb2xvciA9ICJ0cmFuc3BhcmVudCIpLCBwYXJ0ID0gImJvZHkiKSAlPiUNCiAgICBzdHlsZShqID0gMSwgcHJfdCA9IGZwX3RleHRfZGVmYXVsdChpdGFsaWMgPSBUUlVFKSkgDQp9DQpgYGANCg0KYGBge3IgQXBwZW5kaXggMUE6IFNwZWNpZXMgbGlzdHMgZm9yIEFTSVMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzcGVjaWVzX2xpc3RfdGFibGVfZnVuKHBhcmtfY29kZSA9ICJBU0lTIiwgbGV0dGVyID0gIkEiLCBwYXJrID0gIkFzc2F0ZWFndWUgSXNsYW5kIE5hdGlvbmFsIFNlYXNob3JlIikNCmBgYA0KJm5ic3A7DQoNCmBgYHtyIEFwcGVuZGl4IDFCOiBTcGVjaWVzIGxpc3RzIGZvciBDQUNPLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3BlY2llc19saXN0X3RhYmxlX2Z1bihwYXJrX2NvZGUgPSAiQ0FDTyIsIGxldHRlciA9ICJCIiwgcGFyayA9ICJDYXBlIENvZCBOYXRpb25hbCBTZWFzaG9yZSIpDQpgYGANCiZuYnNwOw0KDQpgYGB7ciBBcHBlbmRpeCAxQzogU3BlY2llcyBsaXN0cyBmb3IgQ09MTywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNwZWNpZXNfbGlzdF90YWJsZV9mdW4ocGFya19jb2RlID0gIkNPTE8iLCBsZXR0ZXIgPSAiQyIsIHBhcmsgPSAiQ29sb25pYWwgTmF0aW9uYWwgSGlzdG9yaWNhbCBQYXJrIikNCmBgYA0KJm5ic3A7DQoNCmBgYHtyIEFwcGVuZGl4IDFEOiBTcGVjaWVzIGxpc3RzIGZvciBGSUlTLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3BlY2llc19saXN0X3RhYmxlX2Z1bihwYXJrX2NvZGUgPSAiRklJUyIsIGxldHRlciA9ICJEIiwgcGFyayA9ICJGaXJlIElzbGFuZCBOYXRpb25hbCBTZWFzaG9yZSIpDQpgYGANCiZuYnNwOw0KDQpgYGB7ciBBcHBlbmRpeCAxRTogU3BlY2llcyBsaXN0cyBmb3IgR0FURSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNwZWNpZXNfbGlzdF90YWJsZV9mdW4ocGFya19jb2RlID0gIkdBVEUiLCBsZXR0ZXIgPSAiRSIsIHBhcmsgPSAiR2F0ZXdheSBOYXRpb25hbCBSZWNyZWF0aW9uIEFyZWEiKQ0KYGBgDQombmJzcDsNCg0KYGBge3IgQXBwZW5kaXggMUY6IFNwZWNpZXMgbGlzdHMgZm9yIEdFV0EsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzcGVjaWVzX2xpc3RfdGFibGVfZnVuKHBhcmtfY29kZSA9ICJHRVdBIiwgbGV0dGVyID0gIkYiLCBwYXJrID0gIkdlb3JnZSBXYXNoaW5ndG9uIEJpcnRocGxhY2UgTmF0aW9uYWwgTW9udW1lbnQiKQ0KYGBgDQombmJzcDsNCg0KYGBge3IgQXBwZW5kaXggMUc6IFNwZWNpZXMgbGlzdHMgZm9yIFNBSEksIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzcGVjaWVzX2xpc3RfdGFibGVfZnVuKHBhcmtfY29kZSA9ICJTQUhJIiwgbGV0dGVyID0gIkciLCBwYXJrID0gIlNhZ2Ftb3JlIEhpbGwgTmF0aW9uYWwgSGlzdG9yaWMgU2l0ZSIpDQpgYGANCiZuYnNwOw0K